Идемпотентность

Идемпотентность HTTP методов: Полное руководство

📚 27 вопросовПройти тест →
Лекция

Идемпотентность HTTP методов: Полное руководство

Идемпотентность

Идемпотентность HTTP методов: Полное руководство

Введение: кнопка лифта 🛗

Представь: ты нажал кнопку лифта 5 раз. Лифт всё равно приехал один раз. Это и есть идемпотентность: повтор не меняет итог.
💡 Совет: если запрос могут повторить — он должен быть безопасным.
✅ Вывод: идемпотентность защищает от дублей и ошибок.

Проблема → решение

Проблема: интернет нестабилен. Запросы повторяются. Появляются дубли заказов и списаний. Решение: используем идемпотентные методы. А для POST добавляем Idempotency‑Key.
Вывод: повтор больше не ломает систему.

Чем помогает и как работает

Идемпотентность помогает, когда запрос повторился случайно. Она не даёт создать дубль и не списывает деньги дважды.
Как это работает:
  1. Клиент повторяет запрос при сбое.
  2. Сервер понимает, что это тот же запрос.
  3. Итог остаётся прежним.
Вывод: безопасные повторы = спокойная работа API.

Ключевые термины (простыми словами)

  • Идемпотентность — повтор даёт тот же результат.
  • Safe‑методы — ничего не меняют (только читают).
  • Idempotency‑Key — специальный ключ, чтобы повтор POST не создал дубль.
  • Ретрай — повтор запроса.

Самое важное (must‑know)

  • GET/HEAD/OPTIONS — safe и идемпотентны.
  • PUT/DELETE — идемпотентны, но меняют данные.
  • POST не идемпотентен по умолчанию.
  • POST можно сделать идемпотентным через Idempotency‑Key.
Вывод: повтор безопасен только там, где есть идемпотентность.

1. Что значит «идемпотентный»

Назначение: сделать повтор безопасным.
Простыми словами: повтор не меняет итог.
Аналогия: нажал кнопку лифта — он приехал один раз.
Пример:
PUT /users/42{ "name": "Anna" }
🔎 Как это происходит на практике:
  1. Клиент повторяет PUT.
  2. Сервер ставит то же имя.
  3. Итог не меняется.

Характеристики:

✅ повтор безопасен;

✅ дублей нет.
Когда использовать: обновление и удаление ресурса.
Вывод: идемпотентный запрос можно повторять.

2. Safe и Idempotent — в чём разница

Назначение: понять, какие запросы только читают, а какие меняют.
Простыми словами: safe = ничего не меняю, idempotent = меняю, но повтор безопасен.
Аналогия: посмотреть меню vs заменить блюдо.
🔎 Как это происходит на практике:
  1. GET только читает.
  2. PUT меняет, но повтор не меняет итог.
  3. POST может создать дубль.
Вывод: safe — чтение, idempotent — безопасное изменение.

3. POST и Idempotency‑Key (очень просто)

Назначение: сделать POST безопасным для повторов.
Простыми словами: POST обычно создаёт новый объект. Повтор = дубль.
Аналогия: два одинаковых чека = две покупки.
Пример:
POST /paymentsIdempotency-Key: 8f1a-44c2{ "amount": 1000 }
Как правильно писать ключ:
  • В заголовке Idempotency-Key.
  • Ключ уникален на одну операцию (обычно UUID).
  • Сервер хранит ответ по ключу.
Какую проблему решает:
  • Повтор POST больше не создаёт дубль.
  • Деньги не списываются дважды.
🔎 Как это происходит на практике:
  1. Клиент отправил POST с ключом.
  2. Сервер сохранил ключ и ответ.
  3. Повтор вернул тот же ответ.
Вывод: Idempotency‑Key делает POST идемпотентным.

4. Когда можно повторять запрос

Назначение: не ломать API ретраями.
Простыми словами: повторяем только безопасные запросы.
🔎 Как это происходит на практике:
  1. 5xx/timeout — можно повторить идемпотентный запрос.
  2. 4xx — повторять нельзя, нужно исправить запрос.
Вывод: ретраи = только для идемпотентных запросов.

5. PATCH: зависит от того, как используешь

Простыми словами: если PATCH ставит значение — повтор безопасен. Если делает +1 — нет.
Пример (безопасно):
PATCH /users/42{ "status": "active" }
Пример (опасно):
PATCH /users/42{ "loginCount": "+1" }
Вывод: PATCH идемпотентен только если ставит точное значение.

Сравнение методов

МетодSafeIdempotentКомментарий
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.
🎯

Проверьте знания

Закрепите материал — пройдите тест по теме «Идемпотентность HTTP методов: Полное руководство»

Пройти тест →