Что такое идемпотентность и безопасность 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 всегда идемпотентным.