Какие HTTP методы являются идемпотентными?

Ответ

Идемпотентность в контексте HTTP означает, что многократное выполнение одного и того же запроса с одинаковыми данными приводит к одному и тому же результату на сервере, как если бы он был выполнен только один раз.

Идемпотентные методы:

  1. GET — используется для получения данных. Не изменяет состояние ресурса. Повторные вызовы безопасны.
  2. PUT — используется для полного обновления ресурса. Повторная отправка одного и того же тела запроса не создает побочных эффектов. Ресурс после первого и N-го запроса будет в одинаковом состоянии.
  3. DELETE — используется для удаления ресурса. После первого успешного удаления ресурс отсутствует, поэтому последующие вызовы также возвращают успех (например, 404 Not Found или 410 Gone), не изменяя состояние системы дальше.
  4. HEAD — аналогичен GET, но без тела ответа. Идемпотентен.
  5. OPTIONS и TRACE — также идемпотентны, так как не изменяют состояние.

Неидемпотентный метод:

  • POSTне является идемпотентным. Каждый вызов POST для создания ресурса обычно приводит к созданию нового объекта с новым идентификатором, изменяя состояние сервера.

Пример идемпотентности PUT:

PUT /api/users/123 HTTP/1.1
Content-Type: application/json

{"name": "Alice", "role": "admin"}
  • Первый вызов: Создает или полностью заменяет пользователя с id=123 данными {name: "Alice", role: "admin"}.
  • Повторный вызов с теми же данными: Результат идентичен — пользователь id=123 остается с данными {name: "Alice", role: "admin"}. Состояние системы не изменилось по сравнению с первым вызовом.

Почему это важно для тестирования? Идемпотентные методы можно безопасно повторять при сбоях сети или для реализации механизмов повтора (retry) без риска дублирования операций.

Ответ 18+ 🔞

А, слушай, вот эта ваша идемпотентность — это ж, блядь, такая штука, которая от повторений не ебётся! Представь: ты один раз нажал кнопку, и сто раз нажал — результат на сервере, сука, один и тот же, как будто ты и не пиздел лишний раз. Красота же!

Вот смотри, какие методы у нас спокойные, как удав:

  1. GET — это просто пришёл, посмотрел, ушёл. Ничего не тронул, никого не задел. Можно хоть тысячу раз обновлять страницу — ресурс будет спать себе спокойно.
  2. PUT — ну это как прийти и сказать: «Вот, блядь, стул. Он будет стоять здесь. И точка». Поставил его раз, поставил десять раз — стул стоит на том же месте, а не размножается, как кролики. Полное обновление ресурса, ёпта.
  3. DELETE — удалил раз — ресурса нет. Удаляешь второй раз — а его уже и так нет! Возвращается тебе 404, мол, «чё ты доёбываешься, его же уже в пизду отправили». Состояние системы дальше не меняется.
  4. HEAD, OPTIONS, TRACE — это вообще тихие, скромные ребята. Ничего не меняют, только смотрят. Идемпотентны, как три куска асфальта.

А теперь главный пиздец — POST. Вот это, блядь, неидемпотентный уёбок! Каждый его вызов — это как чих: новый объект, новый ID, состояние сервера летит в тартарары. Отправил запрос на создание заказа два раза из-за глючной сети? Получи, сука, два одинаковых заказа и потом разгребай, мудя.

Вот тебе живой пример с PUT, чтоб совсем понятно было:

PUT /api/users/123 HTTP/1.1
Content-Type: application/json

{"name": "Alice", "role": "admin"}

Первый раз нажал: Сервер такой — «Окей, пользователь 123 теперь Алиса-админ». Создал или заменил, неважно. Второй, десятый, сотый раз нажал с теми же данными: Сервер смотрит на это и думает: «Ну и чё, бля? Он уже и так Алиса-админ. Иди отсюда, заебал». Состояние системы — ни хуя не изменилось!

Вот поэтому эта идемпотентность — святое дело для тестирования и retry-логики. Можно тыкать запрос повторно при обрывах, не боясь, что всё наебнётся и создастся овердохуища дублей. А с POST так не прокатит — там только молиться, чтобы сеть не легла в самый интересный момент.