Идемпотентность¶
Идемпотентность — это свойство операции, при котором повторное применение этой операции не изменяет состояние системы после первого применения.
Иными словами, независимо от количества повторных вызовов, эффект на систему будет тот же, что и от одного вызова.
Идемпотентные 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
}
Такая стратегия используется, например, в Stripe и других API-платформах, чтобы избежать повторных списаний.
Примечание¶
-
Идемпотентность помогает проектировать надёжные API, особенно в условиях сбоев сети, когда клиенты могут повторять запросы.
-
Важно различать идемпотентность и безопасность:
-
GET — и безопасный, и идемпотентный
-
DELETE — не безопасный, но идемпотентный
-
POST — не безопасный, и чаще всего неидемпотентный, но может быть сделан таковым
-