Протокол SOAP
Во многих языках программирования существуют библиотеки для работы с SOAP. Ниже перечислены рекомендуемые библиотеки для популярных языков.
- Perl: SOAP::Lite и XML::Compile;
- PHP: SOAPClient;
- Python: suds;
- Java: Axis2, Metro.
WSDL
Для каждого сервиса в API Директа разработано описание на языке WSDL (Web Services Description Language), в котором представлены методы, входные и выходные структуры данных, типы данных, адрес для запросов к сервису и другое.
Адрес WSDL указан в документации каждого сервиса.
Наиболее функциональные библиотеки SOAP используют WSDL-описания для формирования запросов к сервисам и проверки передаваемых данных. Библиотеки скачивают WSDL-описание, анализируют его и формируют структуры данных, необходимые для вызова методов. Приложению остается заполнить эти структуры данными и выполнить запрос. Информация из ответного сообщения также выдается в виде структуры, свойственной языку программирования. Все это избавляет приложение от необходимости обрабатывать XML.
Примечание
Приложение может самостоятельно формировать SOAP-запросы в формате XML, однако это трудоемкая задача и при наличии полнофункциональной SOAP-библиотеки выполнять ее вручную нецелесообразно.
Запросы к API в формате SOAP
Способ отправки запросов зависит от SOAP-библиотеки. Если библиотека поддерживает WSDL, достаточно указать адрес WSDL-описания. Из него библиотека получает адрес сервиса и выполняет необходимые действия для отправки запроса. Если библиотека не поддерживает WSDL, необходимо явно указывать адрес сервиса.
Адрес WSDL и адрес для запросов указаны в документации каждого сервиса.
Пример запроса
Вызов метода Ads.add
для добавления объявлений рекламодателю agrom
, выполняемый от имени рекламного агентства.
POST /v5/ads/ HTTP/1.1
Host: api.direct.yandex.com
Authorization: Bearer 0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
Accept-Language: en
Client-Login: agrom
Content-Type: text/xml; charset=utf-8
SOAPAction: "https://api.direct.yandex.com/v5/ads/add"
`<?xml version="1.0" encoding="UTF-8"?`
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://api.direct.yandex.com/v5/ads"
<SOAP-ENV:Body
<ns1:AddRequest
<Ads
<AdGroupId1234567</AdGroupId
<TextAd
<TextСлоны всех пород. Сертифицированный питoмник</Text
<TitleКупи слона!</Title
<Hrefhttp://exotic-farm.com/elefants</Href
<MobileNO</Mobile
</TextAd
</Ads
<Ads
<AdGroupId1234567</AdGroupId
<TextAd
<TextНосороги с доставкой. Весенняя распродажа</Text
<TitleКупи носорога!</Title
<MobileNO</Mobile
</TextAd
</Ads
</ns1:AddRequest
</SOAP-ENV:Body
</SOAP-ENV:Envelope
Пример ответа
HTTP/1.1 200 OK
Connection:close
Content-Type:text/xml; charset=utf-8
Date:Fri, 28 Nov 2014 17:07:02 GMT
RequestId:1010101010101010101
Units:10/20828/64000
Units-Used-Login:agrom
Server:nginx
Transfer-Encoding:chunked
`<?xml version="1.0" encoding="UTF-8"?`<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
<SOAP-ENV:Body
<ns3:AddResponse xmlns:ns3="http://api.direct.yandex.com/v5/ads"
<AddResults
<Id7654321</Id
</AddResults<!-- Объявление успешно создано, возвращен его идентификатор --
<AddResults
<Errors
<Code6000</Code
<MessageНеконсистентное состояние объекта</Message
<DetailsВ объявлении должна быть указана или визитка или основная ссылка</Details
</Errors
</AddResults<!-- Ошибка создания объявления --
</ns3:AddResponse
</SOAP-ENV:Body
</SOAP-ENV:Envelope
Пример ошибки
Если выполнение запроса невозможно, возвращается сообщение об ошибке.
HTTP/1.1 200 OK
Connection:close
Content-Type:text/xml; charset=utf-8
Date:Fri, 28 Nov 2014 17:07:02 GMT
RequestId:1010101010101010101
Units:10/20828/64000
Units-Used-Login:agrom
Server:nginx
Transfer-Encoding:chunked
`<?xml version="1.0" encoding="UTF-8"?`<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
<SOAP-ENV:Body
<SOAP-ENV:Fault
<faultcodeSOAP-ENV:Client</faultcode
<faultstringНекорректный запрос</faultstring
<detail
<ns3:FaultResponse xmlns:ns3="http://api.direct.yandex.com/v5/general"
<requestId1010101010101010101</requestId
<errorCode8000</errorCode
<errorDetailВ TextAd отсутствует обязательное поле Text</errorDetail
</ns3:FaultResponse
</detail
</SOAP-ENV:Fault
</SOAP-ENV:Body
</SOAP-ENV:Envelope