====== Техническая информация ======
В данном разделе описана техническая сторона интеграции c сервисами MONT Webstore.
Cистема представляет из себя несколько веб-сервисов, доступ к которомым осуществляется с помощью прикладного протокола HTTPS. Для каждого сервиса существует 2 протокола, с помощью которых можно взаимодействовать с сервисом - XML over HTTP и SOAP.
===== XML over HTTP =====
==== Запросы и ответы ====
XML over HTTP подразумевает 2 типа запроса к серверу:
* GET. В таком случае, все параметры запроса передаются в адресной строке, например, таким методом является [[ru:apiv2:methods:getactivationform#пример_для_xmloverhttp|GetActivationForm]]
* POST. В таком случае все параметры запроса передаются с помощью XML, в качестве POST-данных. Пример такого метода: [[ru:apiv2:methods:startsubscription#пример_для_xmloverhttp|StartSubscription]].
В обоих случаях ответом сервиса является XML, содержащий десериализованный объект ответа.
Для каждого метода в его описании приводятся примеры запросов и ответов сервера, что можно использовать при реализации своего программного обеспечения для формирования нужных запросов.
Необходимый ContentType: "application/xml"
==== Авторизация ====
Для работы некоторых методов веб-сервисов необходима авторизация. В случае XML over HTTP для этого используется [[http://www.w3.org/Protocols/HTTP/1.0/spec.html#BasicAA|Basic Authentication Scheme]], стандартизированная W3C.
==== Примеры использования (PHP) ====
Рассмотрим пример использования веб-сервиса на языке PHP. Все общение с веб-сервисом можно описать одной функцией:
Приведем примеры вызова этой функции в WebStore:
Для метода [[ru:apiv2:methods:getmydetails|GetMyDetails]] (GET):
Для метода [[ru:apiv2:methods:addreserve:summary_page|AddReserve]] (POST):
Pipe080589267777777ABC-1111111500RUR");
Echo "объект: ";
var_dump($result);
?>
Приведем примеры вызова этой функции в Content:
Для метода [[ru:apiv2:methods:getdefaultmenu|GetDefaultMenu]] (GET):
===== SOAP =====
[[http://www.w3.org/TR/soap/|SOAP]] - стандартизированный протокол обмена структурированными сообщениями. В случае использования этого протокола подключения все запросы должны иметь тип "POST", и отправляться на один адрес(для каждого сервиса свой, например, https://sandbox.mont.ru/Version2/Service/B2BServiceV2.svc)
Отправляемое в POST-данных сообщение имеет общую структуру. Рассмотрим её на примере метода [[ru:apiv2:methods:startsubscription|StartSubscription]]:
http://tempuri.org/IB2BServiceV2/StartSubscription
http://www.w3.org/2005/08/addressing/anonymous
https://sandbox.mont.ru/Version2/Service/B2BServiceV2.svc
username
password
123
true
Структура блока Header для всех методов одинакова:
* Элемент Action содержит название вызываемого метода
* Элемент To содержит адрес сервиса, к которому совершается вызов.
* Элемент Security содержит авторизационные данные - логин и пароль.
Структура блока Body для всех методов различна, и зависит от его входных параметров.
Для каждого метода сервиса приводятся примеры SOAP-запросов и ответов.
В большинстве современных языков программирования есть средства для автоматизированной интеграции с SOAP-сервисами, на основе wsdl-файла. Для каждого сервиса wsdl-файл доступен по адресу *serviceAddress*?wsdl, например https://sandbox.mont.ru/Version2/Service/B2BServiceV2.svc?wsdl
Необходимый ContentType: "application/soap+xml"
===== Типы данных =====
На данной странице приводится описание всех типов, которые используются при взаимодействии с сервисами MONT.
==== Список "примитивных" типов ====
^Название^Пример значения в тегах XML^Описание содержания^
|string|"lorem ipsum"|Простая строка, в кодировке UTF-8|
|int|"42"|Целое число|
|decimal|"42.15"|Дробное число, в качестве разделителя используется символ "." (точка). В сервисе обычно применяется для финансовых величин, потому не рекомендуется хранить его в переменных с типом с “плавающей запятой”.|
|bool|"true"|Логическая переменная. Допустимые значения при общении с сервисом - “true” или “false”|
|DateTime|"2015-05-20T12:49:33.6052875"|Дата-время в формате "yyyy-MM-ddTHH:mm:ss.fffffff" в соответствии со стандартом ISO 8601|
|array of T|см. ниже|Массив элементов типа T(где T - любой тип)|
|T?|см. ниже|Поле имеет значение либо типа T(где T - любой тип), либо NULL|
|[[https://tools.ietf.org/html/rfc4122|UUID]]|86F40D0B-AB83-4E42-87B6-3A5F0220AC74|Статистически уникальный 128-битный идентификатор. Существует несколько реализаций стандарта UUID, например реализация от Microsoft - [[https://ru.wikipedia.org/wiki/GUID|GUID]]|
Ниже приведены некоторые комментарии по описанным выше типам данных и их методах описания в API.
==== Значение NULL ====
Значение NULL и в XML over HTTP, и в SOAP кодируется следующим образом(на примере поля ParentId):
Соответственно, если значение этого поля будет отлично от NULL, то это должно описываться таким образом:
25
==== Nullable-типы ====
T? - это специальный тип для описания поля, которое может иметь как значение типа T, так и значение NULL. Необходимо это учитывать при вызове методов и при обработке их результатов.
Если рассматривать случай с SOAP при использовании WSDL, то возможны несколько вариантов распознавания такого типа используемым языком программирования:
* используемый язык программирования имеет динамическую типизацию, и в таком случае поле может иметь оба возможных типа(и тип T, и тип, описывающий в языке значение NULL);
* используемый язык программирования поддерживает такой тип данных, и в случае получения от сервера значения NULL оно так и будет записываться в переменную;
* используемый язык программирования не поддерживает такой тип данных. В таком случае, интерпретация этого значения зависит от языка программирования. Например, большинство строго-типизированных языков подставят значение по умолчанию.
==== Массивы ====
Следует обратить внимание на то, каким образом будут заполняться поля типа “Массив” при использовании протокола XML over HTTP. Рассмотрим 2 примера для этого типа данных:
* Массив элементов “простых” типов, описанных выше. В XML этот массив строк будет отображен следующим образом:
...
...
KL1030RDAFS
ABC-11111
...
...
* Массив элементов “сложных” типов, где каждый элемент массива является объектом и содержит в себе несколько полей. В XML этот массив строк будет отображен следующим образом:
...
...
3
Legacy tree
1
Legacy tree 2
...
...
[[ru:apiv2:bestrequest]] \\