Idempotency-Key. Это позволяет безопасно повторять запросы при сетевых сбоях или таймаутах, не создавая дублирующих операций.
Обязательные операции
Операции создания бронирований требуют обязательного заголовкаIdempotency-Key:
POST /v2/booking/lounges— бронирование бизнес-залаPOST /v2/booking/fast-tracks— бронирование фаст-трека
Опциональные операции
Операции подтверждения и отмены бронирований идемпотентны по своей природе через бизнес-логику (повторный вызов возвращает409 при недопустимом состоянии) и не требуют обязательного ключа идемпотентности. Однако рекомендуется передавать Idempotency-Key для упрощения идемпотентных ретраев при сетевых сбоях:
POST /v2/booking/lounges/{bookingID}/confirm— подтверждение брони бизнес-залаPOST /v2/booking/lounges/{bookingID}/cancel— отмена брони бизнес-залаPOST /v2/booking/fast-tracks/{bookingID}/confirm— подтверждение брони фаст-трекаPOST /v2/booking/fast-tracks/{bookingID}/cancel— отмена брони фаст-трека
Формат ключа идемпотентности
Idempotency-Key — это строка длиной до 256 символов. Рекомендуется использовать UUID для обеспечения глобальной уникальности.
Пример:
Поведение (Source-of-Truth)
При повторном запросе с тем жеIdempotency-Key:
Совпадение тела запроса
Если тело запроса совпадает с сохранённым при первом использовании ключа:- Сервер возвращает строго тот же HTTP-код и тело ответа, что были возвращены при первом запросе
- Заголовок
Idempotency-Status: reusedуказывает на повторное использование результата - Операция не выполняется повторно
Несовпадение тела запроса
Если тело запроса отличается от сохранённого при первом использовании ключа:- Сервер возвращает
409 IdempotencyConflict - Операция не выполняется
Правила сравнения тела запроса
Для определения конфликта сравниваются следующие поля:-
POST /v2/booking/lounges: все поля
LoungeBookingRequest:lounge_idfirst_namelast_nameemailphonecalling_codetransport_numberguests
-
POST /v2/booking/fast-tracks: все поля
FastTrackBookingRequest:fast_track_idfirst_namelast_nameemailphonecalling_codetransport_numberguests
TTL и истечение срока действия
Ключ идемпотентности имеет TTL 72 часа с момента первого использования. После истечения TTL:- Ключ считается недействительным
- Новый запрос с тем же ключом обрабатывается как новый запрос (создаётся новая операция)
- Возвращается
Idempotency-Status: created - Не возвращается ошибка
422или409
Заголовки ответа
Все операции, поддерживающие идемпотентность, возвращают:Idempotency-Key: эхо переданного ключаIdempotency-Status:created— операция создана впервыеreused— операция повторно использована (возвращён сохранённый результат)
Примеры использования
Успешное создание бронирования
Первый запрос:Повторный запрос с тем же ключом и телом
Повторный запрос (идентичный первому):Конфликт идемпотентности
Запрос с тем же ключом, но другим телом:Рекомендации
- Генерация ключей: Используйте UUID v4 для генерации уникальных ключей идемпотентности
- Хранение ключей: Сохраняйте ключи идемпотентности вместе с результатами операций для возможности повторного использования
- Обработка ошибок: При получении
409 IdempotencyConflictпроверьте, не изменились ли параметры запроса - TTL: Учитывайте, что ключи действительны только 72 часа — после истечения срока используйте новый ключ