От чего зависит выбор типа HTTP-запроса (GET, POST, PUT и т.д.)?

«От чего зависит выбор типа HTTP-запроса (GET, POST, PUT и т.д.)?» — вопрос из категории Сети, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор метода HTTP основывается на его семантике, определенной в спецификациях RFC, и следующих ключевых атрибутах операции:

  1. Идемпотентность (Idempotent): Повторение одного и того же запроса несколько раз должно приводить к одному и тому же результату на сервере, как если бы он был выполнен один раз.

    • Идемпотентные: GET, PUT, DELETE, HEAD, OPTIONS.
    • Неидемпотентный: POST, PATCH (не всегда).
  2. Безопасность (Safe): Запрос не должен изменять состояние сервера (только чтение).

    • Безопасные: GET, HEAD, OPTIONS.
    • Небезопасные: POST, PUT, DELETE, PATCH.
  3. Назначение операции (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 может кэшироваться, предзагружаться или индексироваться ботами, что приведет к непреднамеренному удалению.