Как написать свой WSDL документ и SOAP сервис на его основе

Некоторое время назад приступил к написание сервиса SOAP для одного из наших проектов. Хоть я и имею большой стаж в разработки веб приложений, но все как то не работал с сервисами. А тут была поставлена задача написать свой сервис для онлайн бронирования и продажи билетов. Начал копаться в сети и собирать информацию по soap и wsdl. Информации не мало но она вся расчитана на людей кто знает wsdl. Я не входил в их число и поэтому мне было мягко говоря трудновато. Есть руководства которые прямо говорят что используйте zend studio для создания wsdl. Меня это не устраивало ибо я хотел понять принцип и структуру документа. Методом тыканий и ошибок а также прочтения документации на английском я разобрался как строится документ. Хотел бы рассказать вам об общих принципами создания wsdl документа которые помогут вам написать свой первый Soap сервис на основе своего wsdl.

Кстати таким же принципом работает система управления веб сайтом concrete5 CMS. На ее основе можно создать сервис любой сложности и достаточно производительных. Начиная от сервиса онлайн продаж билетов до сервиса предоставления api.

Итак давайте приведу пример wsdl файла который мы будем использовать для нашего сервиса:


< ?xml version="1.0" encoding="utf-8"?>
<definitions name="TicketService"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="urn:ADSBibcodeQuery"
xmlns:tns="urn:ADSBibcodeQuery">

<documentation>
Online ticket service
</documentation>

<types>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:ADSBibcodeQuery">
<element name="bibcode" type="string" minOccurs="1" maxOccurs="100" />
<element name="db_key" type="string" minOccurs="0" />
<element name="data_type" type="string" minOccurs="0" />
</schema>
</types>
<!-- Блок содержит информацию о функции и какие параметры она принимает и возвращает -->
<message name="sessionId">
<part name="body" type="xsd:string" />
</message>
<message name="hallsList">
<part name="body" type="xsd:string" />
</message>
<message name="hallId">
<part name="body" type="xsd:string" />
</message>
<message name="hallScheme">
<part name="body" type="xsd:string" />
</message>
<message name="token">
<part name="body" type="xsd:string" />
</message>
<message name="sessionsList">
<part name="body" type="xsd:string" />
</message>
<!-- Блок содержит список функций, принимаемые и возвращаемые ими данные и параметры -->
<porttype name="TicketServicePort">
<operation name="getListOfHalls">
<input message="tns:sessionId" />
<output message="tns:hallsList" />
</operation>
<operation name="getScheme">
<input message="tns:hallId" />
<output message="tns:hallScheme" />
</operation>
<operation name="getToken">
<input message="tns:token" />
</operation>
<operation name="getSessionsList">
<input message="tns:sessionId" />
<output message="tns:sessionsList" />
</operation>
</porttype>

<service name="TicketService">
<port name="TicketServicePort" binding="tns:TicketServiceBinding">
<http:address location="http://nizami.lk/mini.php?a=external_sale" />
</port>
</service>

<binding name="TicketServiceBinding" type="tns:TicketServicePort">
<http:binding verb="GET" />
<operation name="getListOfHalls">
<http:operation location="http://nizami.lk/mini.php?a=external_sale" />
<input />
<http:urlencoded />

<output>
<mime:content type="text/html" />
</output>
</operation>
<operation name="getScheme">
<http:operation location="http://nizami.lk/mini.php?a=external_sale" />
<input />
<http:urlencoded />

<output>
<mime:content type="text/html" />
</output>
</operation>
<operation name="getToken">
<http:operation location="http://nizami.lk/mini.php?a=external_sale" />
<input />
<http:urlencoded />

<output>
<mime:content type="text/html" />
</output>
</operation>
<operation name="getSessionsList">
<http:operation location="http://nizami.lk/mini.php?a=external_sale" />
<input />
<http:urlencoded />

<output>
<mime:content type="text/html" />
</output>
</operation>
</binding>
</definitions>

Теперь давайте разберем по блокам что у нас находится в этом коде.

Начнем с параметров которые принимают наши методы


<message name="sessionId">
<part name="body" type="xsd:string" />
</message>

name=»sessionId» — этот атрибут содержит название параметра принимаемого функциями

Далее рассмотрим блок объявления методов нашего сервера

<input type="text" />
<output message="tns:hallsList"></output>

name=»getListOfHalls» — это название нашего метода или функции.

<input message=»tns:sessionId» /> — этот блок отвечает за название принимаемой переменной
<output message=»tns:hallsList» /> — этот блок отвечает за возвращаемый результат метода

далее рассмотрим блок кода отвечающий за определение типов данных возвращаемых нашими методами атак же адресами их расположения


<input type="text" />

<output>
</output>

Блок- отвечает объявление операции где getToken- это название нашего метода
Блок отвечает за привязку метода к адресу.

Теперь кода наш файл wsdl готов необходимо запустить сервер, который будет обрабатывать наши запросы.


ini_set('soap.wsdl_cache_enabled', 'Off');

try {
$server = new SoapServer($_SERVER['DOCUMENT_ROOT'] . '/service.wsdl');
$server->setClass("external_sale");
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
} catch (ExceptionFileNotFound $e) {
echo 'Error message: ' . $e->getMessage();
}

Строка $server->setClass(«external_sale»); означает что мы назначаем класс в котором будут методы описанные нами в wsld схеме.

Для запуска клиента необходимо написать:

$client = new
SoapClient(
"http://nizami.lk/mini.php?a=external_sale&amp;amp;action=wsdl"
);

Теперь мы можем использовать методы объявленные в нашем wsdl документе

echo $client->getSessionsList(13);

Конечно вручную писать Wsdl документ тяжеловато. В zend studio его можно автоматически сгенерировать на основе комментариев.

Поделиться в соц. сетях

Другое из текущей категории:

Добавить комментарий