Gymterview
junior

Что такое идемпотентность и безопасность HTTP-методов?

Безопасный метод (Safe method) — метод, который не изменяет состояние ресурса на сервере. Вызов безопасного метода не создаёт побочных эффектов. Безопасные методы: GET, HEAD, OPTIONS.

Идемпотентный метод (Idempotent method) — метод, при котором многократный одинаковый запрос приводит к тому же результату, что и однократный. Повторный вызов не изменяет состояние сервера сверх того, что произвёл первый вызов. Идемпотентные методы: GET, HEAD, OPTIONS, PUT, DELETE.

Аналогия из жизни: кнопка лифта — нажатие на кнопку вызова лифта один раз или десять раз приведёт к одному результату (лифт приедет). Это идемпотентная операция. А вот добавление товара в корзину (POST) при каждом нажатии добавит новый экземпляр.

Примеры

  • DELETE /api/users/42 — первый вызов удалит пользователя, второй вернёт 404, но состояние сервера не изменится дополнительно. Метод идемпотентный.
  • PUT /api/users/42 с одним и тем же телом — каждый вызов приведёт к одному и тому же состоянию ресурса. Метод идемпотентный.
  • POST /api/users — каждый вызов может создать нового пользователя. Метод не идемпотентный.
  • PATCH /api/users/42 с {"age": 31} — идемпотентный, но PATCH /api/users/42 с {"age": "increment"} — не идемпотентный. Зависит от семантики операции.
Пример
Безопасные ⊂ Идемпотентные ⊂ Все методы
GET, HEAD, OPTIONS ⊂ GET, HEAD, OPTIONS, PUT, DELETE ⊂ GET, HEAD, OPTIONS, PUT, DELETE, POST, PATCH

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

На собеседовании: ключевое — объяснить разницу между безопасностью и идемпотентностью. Все безопасные методы идемпотентны, но не наоборот (DELETE идемпотентен, но не безопасен). Частая ошибка — считать PATCH всегда идемпотентным.