Идемпотентность и безопасность методов
Идемпотентность — повторный вызов с теми же параметрами не меняет результат после первого раза. Важное свойство при ненадёжной сети: если ответ потерялся, клиент может безопасно повторить идемпотентный запрос, не боясь побочного эффекта дважды.
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, и если да — просто возвращает прежний результат, не создавая новую запись повторно.
• почему повторный POST без защиты опасен и как это решают идемпотентным ключом (если дошёл до 2-го слоя).