Идемпотентность — свойство операции давать одинаковый результат при одном или множественных выполнениях. В HTTP: GET/PUT/DELETE идемпотентны по RFC (повторный запрос не меняет state). POST не идемпотентен по умолчанию, но можно сделать таким через Idempotency-Key header (Stripe-паттерн). Критично для платежей, заказов, любых "create" endpoints где сетевой retry не должен создать дубликаты.
Ниже: подробности, пример, смежные термины, FAQ.
Бесплатный онлайн-инструмент — проверка HTTP-заголовков: результат мгновенно, без регистрации.
POST /v1/payments
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
{"amount":100,"currency":"RUB"}Идемпотентность в API — это свойство операции, при котором многократное выполнение одной и той же команды приводит к одному и тому же результату. Например, HTTP-метод PUT является идемпотентным, так как повторный запрос на обновление ресурса не изменит его состояние, если данные остаются неизменными.
Идемпотентность является важной концепцией в проектировании API, так как она обеспечивает предсказуемость и надежность взаимодействия между клиентом и сервером. Если клиент отправляет запрос несколько раз из-за сетевых проблем или тайм-аутов, идемпотентность гарантирует, что сервер не изменит состояние ресурса, если запросы одинаковы.
Например, в системе электронной коммерции клиент может повторно отправить запрос на отмену заказа. Если этот запрос идемпотентен, то повторное выполнение не приведет к ошибкам или нежелательным последствиям, таким как множественное аннулирование одного и того же заказа.
Кроме того, идемпотентные операции облегчают обработку ошибок и управление транзакциями. Разработчики могут быть уверены, что повторные запросы не вызовут дополнительных затрат на ресурсы или изменения в состоянии системы.
Рассмотрим пример использования идемпотентного метода PUT для обновления информации о пользователе в RESTful API. Предположим, у нас есть API для управления пользователями, и мы хотим обновить информацию о пользователе с идентификатором 123.
PUT /api/users/123
{
"name": "Иван",
"email": "ivan@example.com"
}Если мы отправим этот запрос один раз, сервер обновит информацию о пользователе. Если мы повторим тот же запрос, результат будет тем же: информация о пользователе останется неизменной, если данные не изменились.
Однако, если мы попытаемся выполнить запрос с новыми данными:
PUT /api/users/123
{
"name": "Петр",
"email": "petr@example.com"
}Сервер обновит информацию о пользователе, но если мы снова отправим тот же запрос, состояние останется неизменным. Таким образом, идемпотентность позволяет избежать неожиданных изменений и обеспечивает стабильность работы API.
Важно отметить, что не все методы HTTP являются идемпотентными. Например, метод POST, используемый для создания новых ресурсов, не является идемпотентным, так как каждый вызов создает новый ресурс. Поэтому при проектировании API необходимо четко разделять идемпотентные и неидемпотентные методы для обеспечения корректности обработки запросов.
Сетевой retry: сервер принял POST, обработал, но ответ потерялся в пути. Клиент думает "не прошло, повторю" → дубль. Idempotency-Key защищает от этого.
Stripe хранит 24 часа. Этого достаточно для retry-окна и не раздувает DB.
Да. Rate limit ≠ не-идемпотентность. Запрос либо разрешается и возвращает данные, либо отбивается с 429 — в обоих случаях state не меняется.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.