Перейти к содержанию

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

Идемпотентность — это свойство операции, при котором повторное применение этой операции не изменяет состояние системы после первого применения.

Иными словами, независимо от количества повторных вызовов, эффект на систему будет тот же, что и от одного вызова.


Идемпотентные HTTP-методы

Метод Идемпотентность Описание
GET ✅ Да Получение данных. Повторные запросы не изменяют состояние сервера.
PUT ✅ Да Полная замена ресурса. Повторный запрос перезапишет ресурс теми же данными.
DELETE ✅ Да Удаление ресурса. Повторный запрос не вызовет ошибку, если ресурс уже удалён.

Неидемпотентный метод

Метод Идемпотентность Описание
POST ❌ Обычно нет Создание ресурса или выполнение действия. Повторные вызовы могут создать дубликаты или вызвать разные эффекты.

Пример неидемпотентного POST:

POST /orders
Content-Type: application/json

{
  "item_id": 123,
  "quantity": 1
}

Пример идемпотентного POST (через идемпотентный ключ)

Иногда POST можно сделать идемпотентным, если клиент указывает уникальный ключ запроса:

POST /payments
Idempotency-Key: abc123
Content-Type: application/json

{
  "user_id": 42,
  "amount": 100
}
Если тот же Idempotency-Key будет использован повторно, сервер вернёт результат первого запроса, а не создаст новый платёж.

Такая стратегия используется, например, в Stripe и других API-платформах, чтобы избежать повторных списаний.


Примечание

  • Идемпотентность помогает проектировать надёжные API, особенно в условиях сбоев сети, когда клиенты могут повторять запросы.

  • Важно различать идемпотентность и безопасность:

    • GET — и безопасный, и идемпотентный

    • DELETE — не безопасный, но идемпотентный

    • POST — не безопасный, и чаще всего неидемпотентный, но может быть сделан таковым