Для чего используется HTTP-метод POST?

«Для чего используется HTTP-метод POST?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

POST — это HTTP-метод для создания нового ресурса или выполнения обработки данных, когда операция не подходит под семантику других методов (GET, PUT, DELETE).

Основные сценарии использования:

  1. Создание ресурса: Отправка данных для создания новой сущности (например, нового пользователя). Сервер обычно назначает новый URI для созданного ресурса.
  2. Выполнение действия: Запуск процесса, операции, которая не является CRUD в чистом виде (например, отправка формы, запуск расчёта).
  3. Отправка данных на обработку: Когда результат не является простым сохранением (например, загрузка файла, вызов RPC-подобного API).

Характеристики:

  • Неидемпотентный: Повторные идентичные POST-запросы могут создавать дублирующиеся ресурсы или иметь другие побочные эффекты.
  • Небезопасный: Выполняет операции, изменяющие состояние сервера.
  • Данные в теле: Параметры передаются в теле запроса, а не в URL.

Пример запроса (создание пользователя):

POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
  "name": "Alice",
  "email": "alice@example.com"
}

Успешный ответ обычно содержит:

  • Код состояния 201 Created.
  • Заголовок Location с URI созданного ресурса.
  • Тело ответа с представлением нового ресурса.

Пример реализации на Spring Boot:

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User newUser) {
    User savedUser = userService.create(newUser);
    URI location = ServletUriComponentsBuilder
                    .fromCurrentRequest()
                    .path("/{id}")
                    .buildAndExpand(savedUser.getId())
                    .toUri();
    return ResponseEntity.created(location).body(savedUser);
}

Сравнение с GET:

  • GET: Используется для получения данных. Параметры — в URL. Кэшируется, остаётся в истории.
  • POST: Используется для отправки/создания данных. Параметры — в теле. Не кэшируется по умолчанию, не должен оставаться в истории браузера.