====== Техническая информация ====== В данном разделе описана техническая сторона интеграции 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]] \\