Ответ
POST — это HTTP-метод для создания нового ресурса или выполнения обработки данных, когда операция не подходит под семантику других методов (GET, PUT, DELETE).
Основные сценарии использования:
- Создание ресурса: Отправка данных для создания новой сущности (например, нового пользователя). Сервер обычно назначает новый URI для созданного ресурса.
- Выполнение действия: Запуск процесса, операции, которая не является CRUD в чистом виде (например, отправка формы, запуск расчёта).
- Отправка данных на обработку: Когда результат не является простым сохранением (например, загрузка файла, вызов 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: Используется для отправки/создания данных. Параметры — в теле. Не кэшируется по умолчанию, не должен оставаться в истории браузера.