Почему для создания ресурса (CREATE) в REST API используют HTTP-метод POST, а не GET?

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

Ответ

Использование 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.