Idempotency-Key
решает эту задачу: сервер запоминает ключ и на повтор отвечает так же, как на
первый запрос, ничего не создавая заново.
Где он работает сегодня
Создание документа
ПередайтеIdempotency-Key в POST /documents, и повтор того же запроса
вернёт тот же документ вместо второго.
Ключ живёт 24 часа и привязан к вашему API-ключу: два разных ключа могут
использовать одинаковую строку, не мешая друг другу. Ключ занимается до
создания документа, поэтому два одновременных запроса с одним ключом не создадут
двух документов — это и есть защита от двойной отправки.
Ответ на повтор не берётся из кеша: сервер перечитывает документ обычным путём,
поэтому права проверяются на каждом ответе, а данные всегда свежие.
Ingest
Ключ передаётся заголовком и выбирается вами. Он должен быть уникальным для содержимого пачки: одна и та же пачка — один ключ, новая пачка — новый ключ.409 — это не ошибка вашей логики, а подтверждение, что первая попытка дошла.
Обрабатывайте его как успех: повторно слать пачку не нужно.
Как жить без идемпотентности
Для создания документа используйтеIdempotency-Key. Для остальных записей
снижайте риск так:
1
Сохраняйте свой идентификатор до вызова
Запишите у себя намерение («создать приказ для сотрудника X по шаблону Y»)
вместе со своим ключом операции, и только потом вызывайте API.
2
После обрыва не повторяйте вслепую
Сначала проверьте, не создался ли документ:
GET /documents?type_id=…&created_after=…&search=…. Если он есть, сохраните
его id и не повторяйте вызов.3
Ретраите только чтения и явно безопасные действия
GET-запросы можно повторять свободно. Повтор _approve или _sign на уже
отработавшем слоте вернёт ошибку состояния, а не создаст дубль.