XML - результаты поиска/Поиск туров — различия между версиями
Jeka (обсуждение | вклад) м (→Назначение сервиса) |
Jeka (обсуждение | вклад) м (→Назначение сервиса) |
||
Строка 8: | Строка 8: | ||
Тип поиска определяет поведение сервиса и предоставляемые им данные. | Тип поиска определяет поведение сервиса и предоставляемые им данные. | ||
+ | |||
=== Импорт данных в свою систему === | === Импорт данных в свою систему === |
Версия 14:26, 8 июля 2014
Содержание
Назначение сервиса
Сервис предназначен для:
- Импорт данных в систему клиента (тип поиска: БД).
- Организация поиска на сайте клиента (тип поиска: комбинированный).
В зависимости от выбранного клиентом способа использования администрацией TourClient выставляется соответствующая настройка сервиса - тип поиска. Клиенту изменение данной настройки недоступна.
Тип поиска определяет поведение сервиса и предоставляемые им данные.
Импорт данных в свою систему
Импорт данных в свою систему может производиться для получения каких-то статистических показателей. Например расчета минимальных по каким-то параметрам. Или же организации каких-то своих сервисов.
Сервис предоставляет только те данные которые в текущий момент сохранены в нашей БД.
Обратите внимание: сервис не предназначен для полной синхронизации БД клиента с нашей (из-за большого объема данных и очень интенсивной скорости обновления нашей БД). Архитектура получения данных в текстовом формате через xml-шлюз маленькими блоками не позволит работать с такими объемами данных, пропускной способности будет недостаточно для оперативного обновления данных (потенциально базу выкачать возможно, но она тут же устарает, и не будет успевать обновляться по данной технологии).
Сервис рекомендуется использовать для получения данных в рамках какого-то среза ограничивающего возможный объем данных: по ограниченному набору отелей, на ближайшие даты, по нескольким странам и т.п.
Особенности работы
- максимально быстрая скорость получения результата
- ответ на запрос формируется сразу полностью
- минимальная цена точная (та которая в текущий момент минимальна в нашей БД по данным параметрам)
- по непопулярным запросам можно получить данных меньше чем в комбинированном поиске, если они в текущий момент не присутствуют в нашей БД (принципы работы комбинированного поиска не позволяют использовать его для выгрузки данных)
- ответы сервиса не кешируются
Ограничения
- Количество данных возвращаемое одним запросом: не более 2500 туров.
- Макс. допустимое количество запросов в сутки: не регламентировано (определяется индивидуально в случае создания клиентом высокой нагрузки на сервис).
Организация поиска на сайте клиента
Используется для организации сервиса подобного нашему модулю Поиск туров - результаты поиска, когда клиент хочет самостоятельно управлять его работой. Позволяет получить результат в текущий момент наиболее соответствующий данным в системах туроператоров.
Сервис предоставляет данные полученные в текущий момент из всех возможных источников: сохраненные в БД, полученные "на лету" из системы туроператора, а также некоторыми другими способами.
Обратите внимание: данный тип поиска для обработки запросов от конечных пользователей, и не предназначен для обработки автоматических запросов. Ограничение вызвано тем что запросы в конечном счете передаются в системы туроператоров, которые зачастую не адаптированы к большой нагрузке. Для автоматических запросов должен использоваться тип поиска БД поиск.
Алгоритм организации поиска
- Приложение формирует поисковый запрос и отправляет его сервису Поиск туров.
- Сервис инициирует новый поиск.
- Приложение ожидает ответа от сервиса.
- Сервис возвращает данные по запрошенной странице, данные о количестве найденных туров и ключ поиска.
- Сервис в фоновом режиме продолжает поиск до нахождения всех данных для запроса.
- Приложение периодически опрашивает сервис Статус поиска, для обновления найденного количества туров и проверки что поиск не завершен.
- Получив информацию что поиск завершен приложение может:
- сообщить пользователю что поиск завершен
- предложить обновить результаты поиска (т.к. могли быть найдены новые данные)
- обновить результаты поиска автоматически
- Для обновления результатов поиска приложение отправляет сервису Поиск туров поисковый запрос, идентичный тому что был отправлен ранее.
Особенности работы
Время поиска
- Т.к. в момент поиска приходится ждать ответа из разных систем, полный поиск может занимать продолжительное время.
- Ограничение на время полного поиска 30 сек., после этого в результаты поиска попадают туры найденные за это время.
- Приложение должно запрашивать у сервиса нужную ему страницу данных. Страница определяется параметрами dataLimit, dataOffset.
- После запроса сервис возвращает данные в момент когда:
- либо найдено достаточное количество данных для формирования запрошенной страницы
- либо истек таймаут
- Таймаут на возврат запрошенной страницы 10 сек. По истечении таймаута сервис вернет все найденные на этот момент предложения.
- Таймаут может быть автоматически увеличен до 30 сек, если за это время ни одного предложения не найдено, но все еще ожидается ответ от медленного поставщика данных.
Минимальная цена
- При возврате запрошенной страницы первым туром будет тур с минимальной ценой из всех найденных в текущий момент.
- Если на момент возврата страницы таймаут еще не истек, это тур с минимальной ценой по данному запросу.
- Если страница возвращена из-за таймаута, то потенциально в процессе поиска могут быть найдены туры с ценой меньше. Они будут доступны по данному запросу после окончания поиска.
Кеширование
- Результаты всех запросов кешируются.
- Последующий запрос с аналогичными параметрами (без учета dataLimit, dataOffset) будет возвращен из кеша.
- Время жизни кеша 15 минут.
- В случае если при обращении к сервису с определенными параметрами поиск по таким параметрам уже идет, то:
- если данные для формирования запрошенной страницы уже найдены, будет возвращен результат
- если данные для формирования запрошенной страницы еще найдены, результат будет возвращен как только будут найдены данные
Ограничения
- Количество данных возвращаемое одним запросом: не более 2500 туров.
- Макс. допустимое количество запросов в сутки: 3000
Обратите внимание: Большее число запросов необходимо согласовывать индивидуально, и может повлечь за собой увеличение тарифов. Если не было соответствующей договоренности, то при превышении нагрузки сервис может быть отключен без предварительного предупреждения.
Сервис Поиск туров
Работа с сервисом осуществляется путем отправки POST запросов на адрес http://tourclient.ru/f/exml/ИДЕНТИФИКАТОР_ПОЛЬЗОВАТЕЛЯ/tours_export .
Параметр request должен содержать xml запроса.
В результате сервис вернет ответ в формате xml.
Запрос к сервису
<?xml version="1.0" encoding="UTF-8"?> <TourSearchRequest> <dataOffset>0</dataOffset> <dataLimit>50</dataLimit> <seatStatus>3</seatStatus> <cityId>1000</cityId> <countryId>12</countryId> <roomSizeId>14</roomSizeId> <adults>2</adults> <children>0</children> <childAge1>0</childAge1> <childAge2>0</childAge2> <durationFrom>7</durationFrom> <durationTill>14</durationTill> <departureFrom>2014-07-25</departureFrom> <departureTill>2014-08-10</departureTill> <ticket>1</ticket> <priceFrom>500</priceFrom> <priceTill>50000</priceTill> <currency>3</currency> <operatorIds> <id>111</id> <id>222</id> <id>333</id> </operatorIds> <resortIds> <id>111</id> <id>222</id> <id>333</id> </resortIds> <resortPlaceIds> <id>111</id> <id>222</id> <id>333</id> </resortPlaceIds> <allocCatId>7</allocCatId> <allocRate>3.56</allocRate> <allocationIds> <id>111</id> <id>222</id> <id>333</id> </allocationIds> <mealIds> <id>111</id> <id>222</id> <id>333</id> </mealIds> <roomViewIds> <id>111</id> <id>222</id> <id>333</id> </roomViewIds> <roomTypeIds> <id>111</id> <id>222</id> <id>333</id> </roomTypeIds> </TourSearchRequest> <TourExtraEntities> <entity>OnlineSeatsState</entity> <entity>ExtraCharges</entity> <entity>City</entity> <entity>Country</entity> <entity>RoomSize</entity> <entity>Resort</entity> <entity>ResortPlace</entity> <entity>Allocation</entity> <entity>AllocCat</entity> <entity>Meal</entity> <entity>RoomType</entity> <entity>RoomView</entity> <entity>Operator</entity> </TourExtraEntities>
Ответ сервиса
Сервис возвращает ответ, содержащий массив объектов Тур (Tours) и объект Статус поиска (SearchStatus)
<?xml version="1.0" encoding="UTF-8"?> <Result> <Tours> <Tour>...</Tour> <Tour>...</Tour> <Tour>...</Tour> ... </Tours> <SearchStatus> ... </SearchStatus> </Result>
Сервис Статус поиска
Работа с сервисом осуществляется путем отправки POST запросов на адрес http://tourclient.ru/f/exml/ИДЕНТИФИКАТОР_ПОЛЬЗОВАТЕЛЯ/tours_export .
Параметр request должен содержать xml запроса.
В результате сервис вернет ответ в формате xml.
Запрос к сервису
<?xml version="1.0" encoding="UTF-8"?> <SearchStatusRequest> <key>df1b446a09606710d301153157fc862b</key> <!-- Уникальный ключ поискового запроса. --> </SearchStatusRequest>
Ответ сервиса
Сервис возвращает ответ объект Статус поиска (SearchStatus)
Сервис возвращает ответ, содержащий массив объектов Тур (Tours) и объект Статус поиска (SearchStatus)
<?xml version="1.0" encoding="UTF-8"?> <Result> <SearchStatus> ... </SearchStatus> </Result>
Описание объектов
Объект Статус поиска
<SearchStatus> <key>df1b446a09606710d301153157fc862b</key> <!-- Уникальный ключ поискового запроса. --> <inProgress>true</inProgress> <!-- Параметр показывающий завершен ли поиск. --> <toursCount>450</toursCount> <!-- Количество найденных (на момент получения статуса) туров в рамках данного поискового запроса. --> <exactCount>false</exactCount> <!-- Параметр показывающий что количество найденных туров окончательное, и при изменении параметров offset и limit изменяться не будет. --> </SearchStatus>
Объект Тур
<Tour> <id>3145968261@511</id> <!-- Уникальный идентификатор тура. --> <operatorId>308</operatorId> <!-- Идентификатор туроператора. --> <cityId>1000</cityId> <!-- Идентификатор города вылета. --> <countryId>12</countryId> <!-- Идентификатор страны прилета. --> <roomSizeId>14</roomSizeId> <!-- Идентификатор размещения (DBL,SNGL,TRL...). --> <departure>2014-07-10</departure> <!-- Дата вылета. --> <arrival>2014-07-17</arrival> <!-- Дата прилета. --> <duration>7</duration> <!-- Продолжительность (количество ночей в отеле). --> <ticket>1</ticket> <!-- Дата прилета. --> <!-- 0 - без билета, 1 - авиаперелет, 2 - поезд, 3 - автобус, 4 - паром, 5 - автомобиль --> <directFlight>false</directFlight> <!-- Прямой перелет. true - известно что перелет прямой. --> <!-- false - известно что перелет с пересадкой. Если не опеределен, то не известно. --> <price>18000</price> <!-- Стоимость тура в валюте запроса. --> <currency>2</currency> <!-- Идентификатор валюты запроса. --> <priceIsApprox>true</priceIsApprox> <!-- Параметр показывает что цена была пересчитана по кросс-курсу и может содержать погрешность пересчета --> <!-- (возникает в случаях когда валюта запроса отлична от валюты предложения и оператор не имеет кросскурса для пересчета). --> <priceOrig>500</priceOrig> <!-- Стоимость тура в валюте туроператора. --> <currencyOrig>1</currencyOrig> <!-- Стоимость тура в валюты туроператора. --> <!-- 1 - USD, 2 - EUR, 3 - RUB, 4 - UAH --> <prevPriceOrig>0</prevPriceOrig> <!-- Предыдущая стоимость тура (в валюте туроператора). --> <priceDiffPercent>0</priceDiffPercent> <!-- Стоимость тура в валюте запроса. --> <!-- 1 - USD, 2 - EUR, 3 - RUB, 4 - UAH --> <ch1From>0</ch1From> <!-- Возраст 1-го ребенка ОТ (для размещений с детьми) --> <ch1Till>0</ch1Till> <!-- Возраст 1-го ребенка ДО (для размещений с детьми) --> <ch2From>0</ch2From> <!-- Возраст 2-го ребенка ОТ (для размещений с детьми) --> <ch2Till>0</ch2Till> <!-- Возраст 2-го ребенка До (для размещений с детьми) --> <resortId>4</resortId> <!-- Идентификатор курорта --> <resortPlaceId>2392</resortPlaceId> <!-- Идентификатор района --> <allocationId>12395</allocationId> <!-- Идентификатор отеля --> <allocCatId>7</allocCatId> <!-- Идентификатор категории отеля --> <mealId>2</mealId> <!-- Идентификатор питания --> <roomTypeId>4</roomTypeId> <!-- Идентификатор типа номера --> <roomViewId>22</roomViewId> <!-- Идентификатор вида из номера --> <isStop>false</isStop> <!-- Параметр показывающий что тур в стопе --> <isStopAllocation>false</isStopAllocation> <!-- Параметр показывающий что тур в т.к. нет мест в отеле --> <isStopFlight>false</isStopFlight> <!-- Параметр показывающий что тур в стопе т.к. нет мест на рейсы --> <!-- Дополнительные объекты, описывающие параметры тура. Присутствуют объекте тур опционарно, в зависимости от параметров входящего запроса --> <OnlineSeatsState>...</OnlineSeatsState> <ExtraCharges>...</ExtraCharges> <City>...</City> <Country>...</Country> <Operator>...</Operator> <RoomSize>...</RoomSize> <Resort>...</Resort> <ResortPlace>...</ResortPlace> <Allocation>...</Allocation> <AllocCat>...</AllocCat> <Meal>...</Meal> <RoomType>...</RoomType> <RoomView>...</RoomView> </Tour>
Дополнительные объекты для объекта Тур
Наличие мест
<OnlineSeatsState> <allocation>1</allocation> <flightThereEco>1</flightThereEco> <flightBackEco>1</flightBackEco> <flightThereBus>2</flightThereBus> <flightBackBus>2</flightBackBus> <isStopFlight>false</isStopFlight> <isStopAllocation>false</isStopAllocation> </OnlineSeatsState>
Доплаты
<ExtraCharges> <visa> <min>25</min> <max>25</max> <currency>1</currency> </visa> <feeFuel> <min>0</min> <max>40</max> <currency>1</currency> </feeFuel> </ExtraCharges>
Город вылета
<City> <id>1000</id> <name>Москва</name> </City>
Страна
<Country> <id>12</id> <name>Египет</name> </Country>
Туроператор
<Operator> <id>308</id> <name>Troyka</name> </Operator>
Размещение
<RoomSize> <id>14</id> <name>DBL</name> <description>2-е взрослых</description> <adults>2</adults> <children>0</children> </RoomSize>
Курорт
<Resort> <id>4</id> <name>Хургада</name> </Resort>
Район (курорта)
<ResortPlace> <id>2392</id> <name>Эль-Дахар</name> </ResortPlace>
Отель
<Allocation> <id>12395</id> <name>Sea View</name> <rate>2.5</rate> </Allocation>
Категория отеля
<AllocCat> <id>7</id> <name>2*</name> </AllocCat>
Питание
<Meal> <id>1</id> <name>AI</name> <description>питание+напитки местного производства</description> </Meal>
Тип номера
<RoomType> <id>13</id> <name>Executive</name> <description>улучш. номер "Executive"</description> </RoomType>
Вид из номера
<RoomView> <id>22</id> <name>ROH</name> <description>без опред. вида из номера</description> </RoomView>