Идемпотентность
Как повторять запросы без риска выполнить действие дважды.
Если связь оборвалась до ответа, интеграция не знает, выполнился ли запрос. Повторять запрос на заказ или продление вслепую опасно: он может выполниться второй раз. Заголовок Idempotency-Key снимает эту неопределённость: запрос с тем же ключом выполняется не больше одного раза.
Когда передавать
| Операции | Idempotency-Key |
|---|---|
| Заказы и продления заказов — всё, что списывает деньги | Обязателен. Без него запрос отклоняется с ошибкой idempotency_key_missing |
| Прочие изменяющие операции | Необязателен, но рекомендуется для операций, которые прибавляют: например, продление запуска |
Чтение (GET) | Не читается |
Как это работает
Ключ идемпотентности — строка от 8 до 128 знаков из латинских букв, цифр и символов _ : . -. Удобно использовать UUID, созданный для каждой операции.
/orders/viewscurl https://api.skystream.su/app/v1/orders/views \ -X POST \ -H "Authorization: Bearer $API_KEY" \ -H "Idempotency-Key: 7c0a5f4e-2b1d-4c9e-9a51-3f6d8e2b1c40" \ -H "Content-Type: application/json" \ -d '{ "channel": "example_channel", "views": 1000 }'API_KEY- Первый запрос с ключом выполняется, и его ответ сохраняется вместе с ключом.
- Повтор с тем же ключом и тем же запросом не выполняется заново: API возвращает сохранённый ответ с тем же кодом и заголовком
Idempotent-Replayed: true. - Ключ хранится 24 часа. После этого запрос с ним считается новым.
Сохранённый ответ приходит с тем же кодом и телом, что и первый, и с заголовком Idempotent-Replayed: true:
HTTP/1.1 201 Created
Content-Type: application/json
Idempotent-Replayed: trueВ теле — тот же заказ с тем же id и той же суммой. Второго списания нет.
Ключи идемпотентности общие для всех ключей API аккаунта: повтор, отправленный другим ключом того же аккаунта, тоже вернёт сохранённый ответ.
Правила
- Один ключ — один запрос. Запрос с тем же ключом, но с другим адресом, строкой запроса или телом отклоняется с ошибкой
422 idempotency_key_reused. Для новой операции создавайте новый ключ. - Пока первый запрос выполняется, повтор с тем же ключом получает
409 idempotency_key_in_progress. Дождитесь ответа и повторите запрос. - Ошибка в запросе ключ освобождает. Если запрос отклонён — нехватка денег, неверное поле, превышен суточный потолок, — ключ не сохраняется: исправьте причину и повторите запрос с тем же ключом.
- Сбой посреди запроса ключ не освобождает. Если запрос завершился ошибкой
500 internal_errorво время выполнения, этот ответ сохраняется под ключом: повтор с тем же ключом получит его же и действие второй раз не выполнит. Прежде чем повторять операцию с новым ключом, проверьте, выполнилась ли она: например, найдите заказ вGET /orders.
Рекомендуемый порядок
- Создайте ключ идемпотентности до первой попытки и сохраните его вместе с операцией.
- При обрыве связи, тайм-ауте или ответе
5xx, кроме500 internal_error, повторите запрос с тем же ключом. - Получив ответ, сохраните результат и больше этот ключ не используйте.
Пример клиента, который так повторяет запросы, — в разделе Ошибки.