Описание интерфейса программной компоненты
3.4. WSDL: описание интерфейса программной компоненты
Для описания интерфейса программной компоненты, включая спецификацию корректных сообщений, был разработан язык WSDL (Web Service Definition Language). Описание на языке WSDL включает в себя следующие семь составляющих (рис. 3.3).
- Описание типов передаваемых данных. При использовании кодирования SOAP Document оно состоит из схемы XML, определяющей корректные сообщения, получаемые программной компонентой в теле пакета SOAP.
- Описание входящих и исходящих сообщений, которые связываются с описанными типами данных.
- Описание операций (сервисов программной компоненты), с каждой из которых связывается входящее и исходящее сообщение.
- Описание типов портов (идентификаторов программных компонент), с каждым из которых связывается некоторый набор операций.
- Описание привязок ( binding ), связывающие типы портов и их сообщений с определенным типом кодирования тела пакета, а также с версией протокола SOAP.
- Описание портов, связывающие типы портов и соответствующие им привязки с конкретными URL.
- Общее описание службы (интерфейса программной компоненты) как совокупности портов.
Далее рассмотрено описание на языке WSDL интерфейса компоненты, которое содержит два сервиса – сложение двух чисел и сложение последовательности чисел. В корневом элементе указаны все используемые пространства имен, включая пространство протокола SOAP 1.2 – http://schemas.xmlsoap.org/wsdl/soap12/.
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
xmlns:tns="http://summa.test/webservices"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
targetNamespace="http://summa.test/webservices"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">В элементе wsdl:types описываются все типы данных. Тип Add будет связан со входящим сообщением сервиса сложения двух чисел, а тип AddResponse – с его исходящим сообщением.
<wsdl:types>
<s:schema elementFormDefault="qualified"
targetNamespace="http://summa.test/webservices">
<s:element name="Add">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="message"
type="tns:AddMessage" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="AddMessage">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="a" type="s:int" />
<s:element minOccurs="1" maxOccurs="1"
name="b" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="AddResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1"
name="AddResult" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>Типы SumList и SumListResponse предназначены для сообщений сервиса сложения списка чисел.
<s:element name="SumList">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="list"
type="tns:ArrayOfInt" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfInt">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded"
name="int" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="SumListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="SumListResult"
type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>В элементах wsdl:message типы данных связываются с идентификаторами сообщений.
<wsdl:message name="AddSoapIn">
<wsdl:part name="parameters" element="tns:Add" />
</wsdl:message>
<wsdl:message name="AddSoapOut">
<wsdl:part name="parameters" element="tns:AddResponse" />
</wsdl:message>
<wsdl:message name="SumListSoapIn">
<wsdl:part name="parameters" element="tns:SumList" />
</wsdl:message>
<wsdl:message name="SumListSoapOut">
<wsdl:part name="parameters" element="tns:SumListResponse" />
</wsdl:message>В элементе wsdl:portType описываются абстрактные операции и используемые ими сообщения.
<wsdl:portType name="MathServiceSoap">
<wsdl:operation name="Add">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
Операция Add складывает два числа
</wsdl:documentation>
<wsdl:input message="tns:AddSoapIn" />
<wsdl:output message="tns:AddSoapOut" />
</wsdl:operation>
<wsdl:operation name="SumList">
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
Операция SumList складывает несколько чисел
</wsdl:documentation>
<wsdl:input message="tns:SumListSoapIn" />
<wsdl:output message="tns:SumListSoapOut" />
</wsdl:operation>
</wsdl:portType>В элементе wsdl:binding операции связываются с транспортным протоколом (HTTP), версией протокола SOAP (1.2) и типом кодирования тела пакета (SOAP-Document).
<wsdl:binding name="MathServiceSoap12" type="tns:MathServiceSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="Add">
<soap12:operation soapAction="http://summa.test/webservices/Add"
style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="SumList">
<soap12:operation soapAction="http://summa.test/webservices/SumList"
style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>В элементе wsdl:service интерфейс программной компоненты связывается с типом порта, с некоторой привязкой, а также с конкретным URL, используемым в дальнейшем для вызова веб службы.
<wsdl:service name="MathService">
<wsdl:port name="MathServiceSoap12" binding="tns:MathServiceSoap12">
<soap12:address location="http://summa.test/webservices/summa.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>Как видно из примера, структура документа на языке WSDL является достаточно сложной, однако благодаря ей одни и те же абстрактные операции могут быть связаны с различными способами передачи информации, включая как разные транспортные протоколы, так и различные версии спецификации SOAP. Для реализации удаленного вызова на основе данной спецификации необходимы средства как для создания WSDL документа по описанию используемого удаленно класса, так и средство создания по известному WSDL документу посредника удаленного вызова.
3.5. Выводы по описанию интерфейса компоненты
Для создания открытой распределенной системы необходимо использование общепринятых языков описания интерфейса программной компоненты. В настоящий момент существует ряд апробированных на практике стандартов для передачи данных в гетерогенных распределенных системах: XML, XSD, SOAP и WSDL. Их использование позволяет создавать системы, не привязанные жестко к какому либо средству разработки программ или транспортному протоколу. Однако открытый характер спецификации SOAP допускает как реализацию использующей ее промежуточной средой некоторой дополнительной функциональности, так и принятие все новых стандартов и расширений, использующих заголовки SOAP. Это может привести к определенным сложностям при взаимодействии основанных на WSDL и SOAP программных компонент различных разработчиков.
