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

Ответ

Выбор метода 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 может кэшироваться, предзагружаться или индексироваться ботами, что приведет к непреднамеренному удалению.

Ответ 18+ 🔞

А, слушай, вот эта тема с HTTP-методами — она же, блядь, основа основ, а народ её так косячит, что волосы дыбом встают. Просто пиздец. Ну давай разжую, как для совсем тупых, только без соплей.

Представь, что у тебя есть сайт, типа бложика. И вот ты, такой умный, пишешь ссылку для удаления статьи: GET /articles/delete/123. И думаешь: «Ну, ссылочка же, чё не так?». А не так, ёпта, всё! Это же GET! Браузер его кэширует, поисковики по нему ползают, префетч может его дернуть просто так, на всякий случай. И вот сидит админ, открывает историю, а там бот гугла уже всё поудалял, пока ползал. Волнение ебать! Это не ошибка, это — преступление. Для удаления есть DELETE, и точка.

Вот смотри, вся фишка в трёх китах:

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

    • Идемпотентные: GET (получил данные), PUT (полностью обновил), DELETE (удалил). Сколько раз ни шлифану DELETE на /articles/123 — статья удалена один раз, потом будет просто «не найдено». Доверия ебать ноль к тем, кто это не понимает.
    • Неидемпотентный: POST (создай). Отправил два одинаковых POST на /articles — получишь две одинаковые статьи, дубли в базе. PATCH (частично обнови) — тоже может быть неидемпотентным, если логика кривая.
  2. Безопасность (Safe). Ещё проще: запрос ничего на сервере не должен менять. Только читать.

    • Безопасные: GET (прочитай), HEAD (только заголовки прочитай), OPTIONS (спроси, что можно). Их можно тыкать сколько угодно.
    • Небезопасные: POST, PUT, DELETE, PATCH. Вот эти уже лезут в базу, меняют данные. Вы ходите по охуенно тонкому льду, когда используете их не по делу.
  3. Ну и зачем они вообще? (CRUD). Вот прям по полочкам:

    • GET /articles?year=2023Получить статьи за 2023. Данные в URL (параметры). Безопасный, идемпотентный, его браузер кэширует. Идеально.
    • POST /articlesСоздать новую статью. Сюда ты в теле запроса (не в URL!) шлёшь JSON с заголовком и текстом. Небезопасный, неидемпотентный. Для создания — идеально.
    • PUT /articles/123Полностью заменить статью с ID 123. Ты шлёшь ВЕСЬ новый JSON статьи. Старый затирается. Небезопасный, но идемпотентный: десять раз отослал — статья как после первого раза.
    • PATCH /articles/123Чуть-чуть поправить статью. Типа, только поле title обновить. Тело — только изменения.
    • DELETE /articles/123Удалить нахуй статью 123. Небезопасный, но идемпотентный. Удалил — её нет. Второй раз удаляешь — её всё ещё нет, получишь 404.

Короче, запомни как «Отче наш»:
Не лепи удаление или создание через GET — будет вам хиросима и нигерсраки в виде почищенной базы или дублей.
POST — для создания сложных сущностей.
PUT — когда знаешь ВЕСЬ новый вид ресурса и хочешь его целиком заменить.
Всё. Э бошка думай, прежде чем метод выбрать, и не будь распиздяем.