Идемпотентность HTTP методов: Полное руководство
Введение: кнопка лифта 🛗
Представь: ты нажал кнопку лифта 5 раз. Лифт всё равно приехал один раз.
Это и есть идемпотентность: повтор не меняет итог.
💡 Совет: если запрос могут повторить — он должен быть безопасным.
✅ Вывод: идемпотентность защищает от дублей и ошибок.
Проблема → решение
Проблема: интернет нестабилен. Запросы повторяются. Появляются дубли заказов и списаний.
Решение: используем идемпотентные методы. А для POST добавляем Idempotency‑Key.
✅ Вывод: повтор больше не ломает систему.
Чем помогает и как работает
Идемпотентность помогает, когда запрос повторился случайно.
Она не даёт создать дубль и не списывает деньги дважды.
Как это работает:
- Клиент повторяет запрос при сбое.
- Сервер понимает, что это тот же запрос.
- Итог остаётся прежним.
✅ Вывод: безопасные повторы = спокойная работа API.
Ключевые термины (простыми словами)
- Идемпотентность — повтор даёт тот же результат.
- Safe‑методы — ничего не меняют (только читают).
- Idempotency‑Key — специальный ключ, чтобы повтор POST не создал дубль.
- Ретрай — повтор запроса.
Самое важное (must‑know)
- GET/HEAD/OPTIONS — safe и идемпотентны.
- PUT/DELETE — идемпотентны, но меняют данные.
- POST не идемпотентен по умолчанию.
- POST можно сделать идемпотентным через Idempotency‑Key.
✅ Вывод: повтор безопасен только там, где есть идемпотентность.
1. Что значит «идемпотентный»
Назначение: сделать повтор безопасным.
Простыми словами: повтор не меняет итог.
Аналогия: нажал кнопку лифта — он приехал один раз.
Простыми словами: повтор не меняет итог.
Аналогия: нажал кнопку лифта — он приехал один раз.
Пример:
PUT /users/42{ "name": "Anna" }🔎 Как это происходит на практике:
- Клиент повторяет PUT.
- Сервер ставит то же имя.
- Итог не меняется.
Характеристики:
✅ повтор безопасен;
✅ дублей нет.
Когда использовать: обновление и удаление ресурса.
✅ Вывод: идемпотентный запрос можно повторять.
2. Safe и Idempotent — в чём разница
Назначение: понять, какие запросы только читают, а какие меняют.
Простыми словами: safe = ничего не меняю, idempotent = меняю, но повтор безопасен.
Аналогия: посмотреть меню vs заменить блюдо.
Простыми словами: safe = ничего не меняю, idempotent = меняю, но повтор безопасен.
Аналогия: посмотреть меню vs заменить блюдо.
🔎 Как это происходит на практике:
- GET только читает.
- PUT меняет, но повтор не меняет итог.
- POST может создать дубль.
✅ Вывод: safe — чтение, idempotent — безопасное изменение.
3. POST и Idempotency‑Key (очень просто)
Назначение: сделать POST безопасным для повторов.
Простыми словами: POST обычно создаёт новый объект. Повтор = дубль.
Аналогия: два одинаковых чека = две покупки.
Простыми словами: POST обычно создаёт новый объект. Повтор = дубль.
Аналогия: два одинаковых чека = две покупки.
Пример:
POST /paymentsIdempotency-Key: 8f1a-44c2{ "amount": 1000 }Как правильно писать ключ:
- В заголовке
Idempotency-Key. - Ключ уникален на одну операцию (обычно UUID).
- Сервер хранит ответ по ключу.
Какую проблему решает:
- Повтор POST больше не создаёт дубль.
- Деньги не списываются дважды.
🔎 Как это происходит на практике:
- Клиент отправил POST с ключом.
- Сервер сохранил ключ и ответ.
- Повтор вернул тот же ответ.
✅ Вывод: Idempotency‑Key делает POST идемпотентным.
4. Когда можно повторять запрос
Назначение: не ломать API ретраями.
Простыми словами: повторяем только безопасные запросы.
Простыми словами: повторяем только безопасные запросы.
🔎 Как это происходит на практике:
- 5xx/timeout — можно повторить идемпотентный запрос.
- 4xx — повторять нельзя, нужно исправить запрос.
✅ Вывод: ретраи = только для идемпотентных запросов.
5. PATCH: зависит от того, как используешь
Простыми словами: если PATCH ставит значение — повтор безопасен. Если делает +1 — нет.
Пример (безопасно):
PATCH /users/42{ "status": "active" }Пример (опасно):
PATCH /users/42{ "loginCount": "+1" }✅ Вывод: PATCH идемпотентен только если ставит точное значение.
Сравнение методов
| Метод | Safe | Idempotent | Комментарий |
|---|---|---|---|
| GET | |||
| ✅ | ✅ | чтение | |
| PUT | ❌ | ||
| ✅ | полное обновление | ||
| DELETE | ❌ | ||
| ✅ | удаление | ||
| PATCH | ❌ | ⚠ зависит | зависит от дизайна |
| POST | ❌ | ❌ | нужен Idempotency‑Key |
Часто спрашивают на собеседованиях
- Что такое идемпотентность?
- Чем safe отличается от idempotent?
- Почему POST не идемпотентен?
- Что делает Idempotency‑Key?
✅ Вывод: это базовые вопросы на интервью.
Типичные ошибки
Ошибка 1: повтор POST без ключа
❌ Дубли заказов.
✅ Решение: Idempotency‑Key + хранить ответ.
Ошибка 2: повторяют 4xx
❌ Повторяют неверный запрос.
✅ Исправляют параметры и только потом повторяют.
Best Practices
- Документируйте правила повторов.
- Делайте POST безопасным через Idempotency‑Key.
- Храните результат по ключу с TTL.
Заключение
Идемпотентность — это «страховка» от повторов и дублей.
Без неё API легко ломается при сбоях.
✅ Вывод: идемпотентность = стабильность и безопасность API.