Ответ
Выбор метода 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 может кэшироваться, предзагружаться или индексироваться ботами, что приведет к непреднамеренному удалению.
Ответ 18+ 🔞
А, слушай, вот эта тема с HTTP-методами — она же, блядь, основа основ, а народ её так косячит, что волосы дыбом встают. Просто пиздец. Ну давай разжую, как для совсем тупых, только без соплей.
Представь, что у тебя есть сайт, типа бложика. И вот ты, такой умный, пишешь ссылку для удаления статьи: GET /articles/delete/123. И думаешь: «Ну, ссылочка же, чё не так?». А не так, ёпта, всё! Это же GET! Браузер его кэширует, поисковики по нему ползают, префетч может его дернуть просто так, на всякий случай. И вот сидит админ, открывает историю, а там бот гугла уже всё поудалял, пока ползал. Волнение ебать! Это не ошибка, это — преступление. Для удаления есть DELETE, и точка.
Вот смотри, вся фишка в трёх китах:
-
Идемпотентность (Idempotent). Звучит страшно, а смысл простой: сколько раз ни долби один и тот же запрос — результат на сервере должен быть как от одного раза.
- Идемпотентные: GET (получил данные), PUT (полностью обновил), DELETE (удалил). Сколько раз ни шлифану DELETE на
/articles/123— статья удалена один раз, потом будет просто «не найдено». Доверия ебать ноль к тем, кто это не понимает. - Неидемпотентный: POST (создай). Отправил два одинаковых POST на
/articles— получишь две одинаковые статьи, дубли в базе. PATCH (частично обнови) — тоже может быть неидемпотентным, если логика кривая.
- Идемпотентные: GET (получил данные), PUT (полностью обновил), DELETE (удалил). Сколько раз ни шлифану DELETE на
-
Безопасность (Safe). Ещё проще: запрос ничего на сервере не должен менять. Только читать.
- Безопасные: GET (прочитай), HEAD (только заголовки прочитай), OPTIONS (спроси, что можно). Их можно тыкать сколько угодно.
- Небезопасные: POST, PUT, DELETE, PATCH. Вот эти уже лезут в базу, меняют данные. Вы ходите по охуенно тонкому льду, когда используете их не по делу.
-
Ну и зачем они вообще? (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 — когда знаешь ВЕСЬ новый вид ресурса и хочешь его целиком заменить.
Всё. Э бошка думай, прежде чем метод выбрать, и не будь распиздяем.