Язык описания Web-служб (Web Services Description Language – WSDL)
Протокол SOAP описывает передаваемые данные. Интерфейс Web-служб он не описывает. Данные, передаваемые по протоколу SOAP, можно закодировать и самостоятельно. Но лучше для этой цели создать вспомогательные классы (классы-заместители), которые будет использовать программа-клиент. Ведь чтобы самостоятельно закодировать данные, необходимо знать спецификацию SOAP до мельчайших подробностей и провести синтаксичесий разбор возвращаемого XML-пакета.
Язык WSDL (Web Services Description Language – язык описания Web-служб) предназначен для описания интерфейса Web-служб. В качестве примера мы опишем с помощью языка WSDL интерфейс Web-службы SimpleWebService, имеющей один метод Add (Сложение). Использовать язык WSDL для описания интерфейса Web-служб, которые для передачи данных используют другие протоколы, а не протокол SOAP, мы не будем. Чтобы увидеть описание на языке WSDL Web-службы SimpleWebService, введите в адресной строе браузера следующий унифицированный указатель информационного ресурса (URL) http://localhost/SimpleWebService/Add.asmx?WSDL. Описание Web-службы в языке WSDL состоит из нескольких разделов. В разделе <types> (<типы>) определены следующие типы:
- Add (Сложение). Описывает данные, передаваемые Web-службе по протоколу SOAP;
- Addresponse. Описывает результаты, возвращаемые Web-службой клиенту по протоколу SOAP.
Тип Add (Сложение) имеет два элемента, каждый из которых встречается лишь один раз. Элементы имеют имена х и у и принадлежат типу long, определенному спецификацией XSD (XMLSchema Definition – Определение схемы XML). Возвращаемый параметр AddResponse coдepжит один элемент AddResult, который встречается один раз и также принадлежит типу long, определенному, как мы уже знаем, в спецификации XSD (XML SchemaDefinition – Определение схемы XML). Обратите внимание, как рассмотренные типы использовались ранее, при описании протокола SOAP.
<types> <s:elemerz name="Add"> <s: comjl.exType> <s: sequence> <salement minOccurs="1" maxOccurs="1" name="x" type="s:int" /> <s:element minOccurs="1" maxOccurs="1" name="y" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="AddResponse"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="AddResult" type="s:int" /> </s:sequence> </s:complexType> </s:elment> </types>
В разделе <message> (<сообщение>) описывается использование этих типов в качестве параметре.
<message name="AddSoapIn"> <! – сообщение – > <part name="parameters" element="s0:Add" /> <! – параметры – > </message> <! – сообщение – > <message name="AddSoapOut"> <! – сообщение – > <part name="parameters" element="s0:AddResponse" /> <! – параметры – > </message> <! – сообщение – >
В разделе <portType> (тип порта) с Web-службой сопоставляются отдельные Web-методы, которые описаны в элементах <operation> (<действие>). Если бы данная Web-служба использовала большее количество методов, тогда в разделе <portType> (тип порта) было бы больше элементов operation (действие) [Читатели, склонные проводить параллели, увидят здесь аналогию с интерфейсом модели компонентных объектов Microsoft (COM).]. Операции ввода и вывода каждого метода связаны с соответствующими сообщениями, которые были определены раньше.
<portType name="TestSoap"> <operation name="Add"> <! – операция – > <input message="s0:AddSoap!n" /> <output message="s0:AddSoapOut" /> </operation> <! – операция – > </portType>
В разделе <binding> (<связывание>) каждому действию ставится в соответствие способ кодирования и протокол передачи данных.
<binding name="TestSoap" type="s0:TestSoap"> <soap:binding transport="http://sohemas.xmlsoap.org/soap/http" style="dooument" /> <! – стиль = "документ" – > <operation name="Add"> <! – название операции – > <soap:operation soapAction="http://tempuri.org/Add" style="document" /> <! – стиль = "документ – > <input> <! – ввод – > <soap:body use="literal" /> </input> <! – ввод – > <output> <! – вывод – > <soap:body use="literal" /> </output> <! – вывод – > </operation> <! – операция – > </binding>
В разделе <service> (<служба>) указывается порт, используемый Web-службой, и адрес, по которому можно активизировать Web-службу.
<service name="Test"> <! – имя = "Испытание – > < port name="ТезtSoap" binding="s0:TestSoap"> <! – порт – > <soap:address location= "http://localhost/SimpleWebService/Add.asmx" /> </port> <! – порт – > </service>