Ответ
Выбор метода HTTP основывается на его семантике, определенной в спецификациях RFC, и следующих ключевых атрибутах операции:
-
Идемпотентность (Idempotent): Повторение одного и того же запроса несколько раз должно приводить к одному и тому же результату на сервере, как если бы он был выполнен один раз.
- Идемпотентные: GET, PUT, DELETE, HEAD, OPTIONS.
- Неидемпотентный: POST, PATCH (не всегда).
-
Безопасность (Safe): Запрос не должен изменять состояние сервера (только чтение).
- Безопасные: GET, HEAD, OPTIONS.
- Небезопасные: POST, PUT, DELETE, PATCH.
-
Назначение операции (CRUD):
- GET — Получение (Read) данных. Данные передаются в URL (query-параметры). Кэшируется браузерами и прокси.
- POST — Создание (Create) нового ресурса или выполнение сложного действия (например, запуск процесса). Данные — в теле запроса.
- PUT — Полное замещение (Update) ресурса по известному URI. Идемпотентен.
- PATCH — Частичное обновление ресурса.
- DELETE — Удаление (Delete) ресурса.
Практические примеры выбора:
GET /articles?year=2023— Получить список статей за 2023 год. Безопасный, идемпотентный, кэшируемый.POST /articles— Создать новую статью. Тело запроса содержит JSON с данными статьи. Небезопасный, неидемпотентный.PUT /articles/123— Полностью обновить статью с ID 123. Тело содержит новое полное представление статьи. Небезопасный, но идемпотентный (два одинаковых PUT дадут тот же результат).DELETE /articles/123— Удалить статью с ID 123. Небезопасный, но идемпотентный (после первого удаления ресурса его уже нет, последующие запросы также вернут "404 Not Found" или "410 Gone").
Ошибка: Использовать GET для операций, изменяющих данные (например, GET /users/delete/1), так как GET может кэшироваться, предзагружаться или индексироваться ботами, что приведет к непреднамеренному удалению.