Перейти к содержимому

Идемпотентность и безопасные повторы

Сетевой тайм-аут не показывает, завершилось ли изменение до потери ответа. Для перечисленных ниже операций передавайте Idempotency-Key, чтобы безопасно повторить тот же логический запрос.

Создавайте новый UUID для каждого нового логического изменения и передавайте его в заголовке:

Окно терминала
curl -X POST "https://api.ltesocks.io/v2/ports/10000/reset" \
-H "Authorization: Bearer ${LTESOCKS_API_TOKEN}" \
-H "Idempotency-Key: 7c838e2d-7d52-42e7-aed1-528829cbd514"

Официальные SDK создают ключ автоматически для поддерживаемых мутаций. Передайте сохраненный UUID явно, если продолжаете тот же логический запрос после перезапуска приложения:

const port = await client.ports.reset({
id: '10000',
idempotencyKey: '7c838e2d-7d52-42e7-aed1-528829cbd514',
});

Храните ключ вместе с методом, путем и телом, пока результат не станет известен. Повторно используйте его только для точного повтора этого запроса. Для нового действия, другого пути или измененного тела создавайте новый UUID.

Когда API возвращает ранее сохраненный результат, ответ содержит:

Idempotency-Replayed: true

Повтор сохраняет первоначальный ответ и его заголовки, включая Retry-At и Retry-After, если они присутствовали.

РезультатДействие
Соединение закрылось или истек тайм-аут до получения ответаПовторить точный запрос с тем же ключом
Ресурс уже содержит нужное изменениеНе отправлять изменяющий запрос повторно
Ошибка валидации или авторизацииИсправить причину; для измененного запроса использовать новый ключ
Ответ о cooldown сбросаПодождать до Retry-After или Retry-At, затем проверить, нужен ли тот же логический запрос
Намеренный запуск следующего измененияСоздать новый ключ

Для временных ошибок используйте ограниченный экспоненциальный backoff с jitter. Идемпотентность предотвращает повторное выполнение, но не делает неограниченные повторы или высокую параллельность безопасными.

Публичный контракт принимает Idempotency-Key для следующих изменений:

ОбластьОперации
АккаунтPOST /user/preferences
ЗаказPOST /ports/order
ТарифPOST /ports/{id}/extend, POST /ports/{id}/plan
Настройки портаPOST /ports/{id}/tags, POST /ports/{id}/autorenew, POST /ports/{id}/signature, POST /ports/{id}/credentials, POST /ports/{id}/autoreset
ПодключениеPOST /ports/{id}/reset

Не добавляйте заголовок ко всем POST автоматически. Например, фильтрация POST /ports и совместимые операции удаления не документируют поддержку идемпотентности. Проверяйте наличие заголовка у конкретной операции в справочнике API.

Cooldown и признаки завершения сброса описаны на странице Сброс и готовность порта.