Карта / Веб-сервисы (REST/SOAP) / Идемпотентность и безопасность методов

Идемпотентность и безопасность методов

Идемпотентность — повторный вызов с теми же параметрами не меняет результат после первого раза. Важное свойство при ненадёжной сети: если ответ потерялся, клиент может безопасно повторить идемпотентный запрос, не боясь побочного эффекта дважды.

PUT /api/users/5 {"name": "Артур"}    — идемпотентен: повторили 5 раз, результат тот же
DELETE /api/users/5                     — идемпотентен: удалили один раз, повторное удаление ничего не меняет

POST /api/orders {"item": "книга"}    — НЕ идемпотентен: каждый вызов создаст НОВЫЙ заказ

Безопасные методы (safe) — вообще не меняют состояние сервера, только читают:

GET /api/users/5   — безопасный: просто читает, ничего не меняет
Копнуть глубже

Сводная таблица по стандартным HTTP-методам:

МетодБезопасный (safe)Идемпотентный
GETдада
PUTнетда
DELETEнетда
POSTнетнет
PATCHнетобычно нет

Почему это важно на практике. Балансировщики нагрузки и клиенты с автоматическим retry безопасно повторяют идемпотентные запросы при сетевом сбое, не спрашивая разрешения — для GET/PUT/DELETE это ничем не грозит. Для POST повторная отправка без дополнительной защиты создаст дубликат (два одинаковых заказа вместо одного) — поэтому критичные POST-операции часто защищают через идемпотентный ключ: клиент передаёт уникальный id операции, сервер проверяет, не обрабатывал ли он уже запрос с таким id, и если да — просто возвращает прежний результат, не создавая новую запись повторно.

🎤 Закрыл тему, если можешь объяснить:
• что значит идемпотентность на примере PUT и POST;
• почему повторный POST без защиты опасен и как это решают идемпотентным ключом (если дошёл до 2-го слоя).