WSDL: описание интерфейса программной компоненты
Для описания интерфейса программной компоненты, включая спецификацию корректных сообщений, был разработан язык WSDL (Web Service Definition Language). Описание на языке WSDL включает в себя следующие семь составляющих (рис. 3.3).
Рис. 3.3. Составные части WSDL документа
-
.Описание типов передаваемых данных. При использовании кодирования 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 документу посредника удаленного вызова.
Содержание раздела