Параметры запроса#

Детальное описание всех параметров для запроса /avia/pnr_retrieve.

Обязательные параметры#

ПараметрТипОписание
bookingIdguidИдентификатор бронирования из /avia/pnr_create (формат UUID)

Примеры запросов#

Минимальный запрос#

1curl -X POST https://test.travel-api.ru/avia/pnr_retrieve \
2  -H "Authorization: Bearer YOUR_TOKEN" \
3  -H "Content-Type: application/json" \
4  -d '{
5    "bookingId": "019a0c82-5d2b-7a5e-84fe-56357a57df66"
6  }'
 1var request = new PnrRetrieveRequest
 2{
 3    BookingId = "019a0c82-5d2b-7a5e-84fe-56357a57df66"
 4};
 5
 6var response = await httpClient.PostAsJsonAsync(
 7    "https://test.travel-api.ru/avia/pnr_retrieve",
 8    request
 9);
10
11var result = await response.Content.ReadFromJsonAsync<PnrRetrieveResponse>();

Когда использовать#

После создания бронирования#

Сразу после создания бронирования получите полные детали:

1{
2  "bookingId": "019a0c82-5d2b-7a5e-84fe-56357a57df66"
3}

Отображение деталей пользователю#

Когда пользователь запрашивает детали своего бронирования:

1var bookingId = "019a0c82-5d2b-7a5e-84fe-56357a57df66";
2var booking = await RetrieveBooking(bookingId);
3
4DisplayBookingDetails(booking);

Проверка статуса#

Периодически проверяйте статус бронирования:

 1var booking = await RetrieveBooking(bookingId);
 2
 3if (booking.Pnr.Cancelled)
 4{
 5    Console.WriteLine("Бронирование отменено");
 6}
 7else if (booking.Pnr.Tickets.Any())
 8{
 9    Console.WriteLine("Билеты выписаны");
10}
11else
12{
13    Console.WriteLine("Ожидает оплаты");
14}

Перед модификацией#

Перед любой модификацией бронирования получите актуальные данные:

1// Получаем актуальное состояние
2var booking = await RetrieveBooking(bookingId);
3
4// Проверяем возможность модификации
5if (!booking.Pnr.Cancelled && !booking.Pnr.Tickets.Any())
6{
7    // Можно модифицировать
8}

Типичные сценарии#

Сценарий 1: Отображение бронирования#

  1. Пользователь запрашивает детали бронирования
  2. Отправляете запрос с bookingId
  3. Получаете полную информацию
  4. Отображаете пользователю: маршрут, пассажиры, цену, статус
sequenceDiagram
    participant User
    participant Client
    participant API
    participant GDS

    User->>Client: Показать детали бронирования
    Client->>API: POST /avia/pnr_retrieve<br/>{bookingId}
    API->>GDS: Получить PNR
    GDS-->>API: PNR данные
    API-->>Client: Полная информация

    Client->>User: Отобразить:<br/>- PNR локатор<br/>- Маршрут<br/>- Пассажиры<br/>- Цена<br/>- Статус

Сценарий 2: Проверка перед выпиской#

  1. Пользователь готов оплатить
  2. Получаете актуальные детали бронирования
  3. Проверяете, что бронирование не отменено
  4. Проверяете срок действия (timeLimit)
  5. Выписываете билет
sequenceDiagram
    participant User
    participant Client
    participant API
    participant GDS

    User->>Client: Готов оплатить
    Client->>API: POST /avia/pnr_retrieve<br/>{bookingId}
    API->>GDS: Получить PNR
    GDS-->>API: PNR данные
    API-->>Client: Детали бронирования

    Client->>Client: Проверить статус

    alt Бронирование активно
        Client->>Client: Проверить timeLimit
        alt Срок не истек
            Client->>API: POST /avia/ticket_issue<br/>{bookingId, payment}
            API->>GDS: Выписать билеты
            GDS-->>API: Билеты выписаны
            API-->>Client: ticketDocuments[]
            Client->>User: Билеты выписаны
        else Срок истек
            Client->>User: Бронирование истекло,<br/>нужно создать новое
        end
    else Бронирование отменено
        Client->>User: Бронирование отменено
    end

Сценарий 3: Мониторинг бронирований#

  1. Периодически запрашиваете список активных бронирований
  2. Для каждого получаете актуальный статус
  3. Обрабатываете истекшие или отмененные
sequenceDiagram
    participant Scheduler
    participant Client
    participant API
    participant GDS
    participant Database

    loop Каждые 30 минут
        Scheduler->>Database: Получить активные бронирования
        Database-->>Scheduler: bookingIds[]

        loop Для каждого bookingId
            Scheduler->>API: POST /avia/pnr_retrieve<br/>{bookingId}
            API->>GDS: Получить PNR
            GDS-->>API: PNR данные
            API-->>Scheduler: Статус бронирования

            alt Бронирование отменено
                Scheduler->>Database: Обновить статус: CANCELLED
                Scheduler->>Scheduler: Отправить уведомление
            else Срок истек
                Scheduler->>API: POST /avia/pnr_cancel<br/>{bookingId}
                Scheduler->>Database: Обновить статус: EXPIRED
            else Билеты выписаны
                Scheduler->>Database: Обновить статус: TICKETED
            end
        end
    end

Рекомендации#

Кеширование#

Не кешируйте результаты надолго — бронирование может измениться:

  • Статус может стать cancelled
  • Билеты могут быть выписаны
  • Срок действия может истечь

Рекомендуемое время кеширования: 1-2 минуты.

Обработка ошибок#

 1try
 2{
 3    var booking = await RetrieveBooking(bookingId);
 4
 5    if (booking.Pnr.Cancelled)
 6    {
 7        return ShowError("Бронирование отменено");
 8    }
 9
10    return ShowBooking(booking);
11}
12catch (ApiException ex) when (ex.Code == "BOOKING_NOT_FOUND")
13{
14    return ShowError("Бронирование не найдено");
15}
16catch (ApiException ex) when (ex.Code == "ACCESS_DENIED")
17{
18    return ShowError("Нет доступа к бронированию");
19}

Проверка срока действия#

1var booking = await RetrieveBooking(bookingId);
2var fareInfo = booking.Pnr.FareInfo.Fares[0];
3
4// Проверяем срок оплаты (если есть в данных)
5// Обычно timeLimit находится в данных создания бронирования
6// или определяется правилами авиакомпании

Отображение информации#

Показывайте пользователю ключевую информацию:

  • Номер бронирования (PNR locator)
  • Маршрут полета
  • Данные пассажиров
  • Общую стоимость
  • Статус (забронировано, выписано, отменено)
  • Номера билетов (если выписаны)
 1Console.WriteLine($"PNR: {booking.Pnr.PnrLocator}");
 2Console.WriteLine($"Статус: {GetBookingStatus(booking)}");
 3Console.WriteLine($"Маршрут: {GetItineraryDescription(booking.Pnr.Itinerary)}");
 4Console.WriteLine($"Пассажиры: {booking.Pnr.Passengers.Count}");
 5Console.WriteLine($"Сумма: {booking.Pnr.FareInfo.Fares[0].Price.Total.Value} {booking.Pnr.FareInfo.Fares[0].Price.Total.CurrencyCode}");
 6
 7if (booking.Pnr.Tickets.Any())
 8{
 9    Console.WriteLine("Билеты:");
10    foreach (var ticket in booking.Pnr.Tickets)
11    {
12        Console.WriteLine($"  {ticket.Number}");
13    }
14}