Ответ
Использование POST для операций создания соответствует семантике HTTP и принципам REST.
| Сравнение POST vs GET: | Критерий | POST (Для CREATE) | GET (Не для CREATE) |
|---|---|---|---|
| Семантика | Создание нового ресурса. | Получение (чтение) существующего ресурса. | |
| Идемпотентность | Нет. Повторный запрос может создать дубликат. | Да. Многократный вызов не меняет состояние. | |
| Безопасность | Не безопасен. Изменяет состояние сервера. | Безопасен. Только для чтения. | |
| Тело запроса | Есть. Можно передать сложные данные (JSON, XML). | Нет (игнорируется). Данные передаются в URL. | |
| Кеширование | По умолчанию не кешируется. | Может кешироваться. |
Пример корректного использования:
@PostMapping("/api/users")
public ResponseEntity<User> createUser(@RequestBody UserDto userDto) {
User created = userService.create(userDto);
// Возвращаем статус 201 Created с заголовком Location
return ResponseEntity
.created(URI.create("/api/users/" + created.getId()))
.body(created);
}
Вывод: GET нарушает контракт HTTP (безопасность, идемпотентность) и имеет технические ограничения (длина URL), поэтому для создания используется POST.