Программирование морских круизов в restapi Инфофлота


1. Введение:

Морские лайнеры очень большие и имеют огромное количество кают и требуют другого подхода чем речные круизы. При покупке морских круизов информация о доступности категорий кают, тарифов и кают запрашивается с сайта оператора лайнера (оператор это на пример MSC) в режиме реального времени. Для речных круизов она берётся из нашей БД которая синхронизируется с операторами каждые несколько часов.

До недавнего времени наш restapi (http://restapi.infoflot.com/) поддерживал только речные круизы и морские круизы работали в рестапи только частично.

Цель этого документа, помочь агентам  запрограммировать на своих сайтах морские круизы используя весь функционал морских который есть на наших главных сайтах:


2. Что не работает когда морские круизы запрограммированы точно так же как речные:

Нам поступало очень много критики от агентов что рестапи для морских круизов выдает неправильную информацию. А именно, для морских круизов:

  1. Метод /cruises/:id/cabins (урл типа https://demoapi.infoflot.com/cruises/434524/cabins?key=91dd7... но вставьте в него ваш АПИ ключ key), возвращает приблизительные цены категорий кают, а status - доступна ли каюта к продаже - вообще почти всегда неправильный.
  2. Метод /cruises/:id/cabins/search (урл типа https://demoapi.infoflot.com/cruises/434524/cabins/search?adult_count=2&key=91dd7...  но вставьте в него ваш АПИ ключ key) поиск кают доступных к продаже вообще неправильно работает так как status - доступна ли каюта к продаже - неправильный.
  3. В самой подаче заявки, POST /requests, непонятно как передавать информацию специфичную для морских круизов (например время обеда или каюту фортуну "Гаранти").

3. Как должен работать процесс покупки морского круиза.

Если метод, /cruises/:id (например https://demoapi.infoflot.com/cruises/434524?key=91dd7... но вставьте в него ваш АПИ ключ key), возвращает флаг isSeaFormattedCabins = true, процесс покупки круиза должен идти как у морского круиза, через методы рестапи:

Что бы получить интуитивное представление как работает процесс покупки морского круиза через эти методы которые запрашивают информацию с сайта оператора в режиме реального времени, зайдите на старом сайте на страницу морского круиза в броузере Chrome:

Процесс подачи заявки у морских совсем другой чем у речных:

Подача морской заявки - возраст ребенка.

1. В первом шаге, запрашивается максимальный возраст ребенка с сайта оператора через наш АПИ. Откройте Chrome debugger (F12), перезагрузите страницу и в табе дебагера Network дайте поиск на "getAge":

Подача морской заявки - возраст ребенка в дебагере.

В рестапи этот метод, getAge, называется SeaChildMaxAge: /cruises/SeaChildMaxAge/:id. Вам надо будет его вызывать, по урлу типа https://demoapi.infoflot.com/cruises/SeaChildMaxAge/434524?key=91dd7... (но замените key на ваш АПИ ключ), и показывать этот максимальный возраст ребенка на самом первом шаге бронирования.

2. Во втором шаге запрашиваются категории кают и тарифы кают доступных для покупки. Здесь выберите количеств взрослых и детей и максимальный возраст ребенка, щелкните на "Выбрать категорию каюты". И в окне дебагера, дайте поиск на getPrice. Анализируйте что посылает и возвращает этот метод для второго шага бронирования.

В рестапи этот метод, getPrice, называется SeaCategories /cruises/SeaCategories/:id. Вам надо будет его вызывать, по урлу типа https://demoapi.infoflot.com/cruises/SeaCategories/434524?adults=2&children=1&childrenAge=8&key=91dd7... (но замените key на ваш АПИ ключ), и показать пользователю выбрать категории кают и тарифы и дать пользователю выбрать подходящий для него тариф.

Но лучше вместо SeaCategories /cruises/SeaCategories/:id вызывайте более новый /cruises/SeaCategoriesV2/:id второй версии. По урлу типа https://demoapi.infoflot.com/cruises/SeaCategoriesV2/434524??adults=2&children=1&childrenAge=8&key=91dd7...
 В нём есть:
Затем, в этом шаге в броузере выберете категорию кают и тариф, и в дебагере дайте поиск на getCabins.

В рестапи этот метод, getCabins, называется /cruises/SeaCabins/:id. Вам надо будет его вызывать, по урлу типа https://demoapi.infoflot.com/cruises/SeaCabins/434524?fare_id=EARLY%20BOOKING%20DRINKS&category_id=IR2&adults=2&children=1&childrenAges=8&key=91dd7... (но замените key на ваш АПИ ключ), и показать пользователю доступные каюты и дать ему возможность выбрать каюту.

3. В третьем шаге выбирается на фронте желаемое время обеда dinerTime. (Значения dinerTime описаны в requests/postSeaRequest.)

4. В четвертом шаге вводятся данные туристов почти точно так же как для речных круизов в рестапи (не как здесь в дебагере, а как описано в requests/postSeaRequest).

5. В пятом шаге подается морская заявка. Вам надо будет подавать заявку в рестапи методом POST на postSeaRequest, requests/postSeaRequest, на https://demoapi.infoflot.com/requests/postSeaRequest и передавать в него данные собранные в предыдущих 4-ёх шагах.

Каюты фортуна - garantee:

На морских популярна продажа кают "фортуна" - "гаранти". Путешественнику на сайте продается каюта гарантированно "классом не ниже чем". Прийдя на корабль он разузнает какого класса у него каюта и будет приятно удивлен.

У MSC, номер такой каюты всегда G00000. Их надо показывать пользователю как обычно, и передать как обычно в поле cabin в requests/postSeaRequest. Букинг создаст у нас внутренний номер каюты и мы запросим бронь на такую каюту у MSC.

4. Используйте наш дев:

В процессе разработки, пожалуйста тестируйте ваш код посылая запросы на devrestapi, https://demoapi.infoflot.com/ что бы не мешать работать боевым сайтам и не захламлять наши в ваши аккаунты тестовыми заявками. (Как ваш код будет готов, вам  https://demoapi.infoflot.com/ надо будет поменять на боевой рестапи https://restapi.infoflot.com/.)

Заявки которые вы пошлете на наш дев (на https://demoapi.infoflot.com/requests/postSeaRequest) будут видны в вашем аккаунте на нашем дев букинге.

Напишите нам на n.kitsul at flotconsult.ru что бы мы вам дали к нему доступ, и ответили на возникшие у Вас вопросы.
И сообщите нам пожалуйста если найдете в этой документации ошибки или неясности.