Автор: Михаил Плискин(dotSITE team)
Источник: dotSITE
В связи с широчайшим распространением сетевых технологий в настоящее время
многие производители аппаратного и программного обеспечения прилагают свои
усилия к выработке различных парадигм и методологий использования этих самых
технологий. Не осталась в стороне, разумеется, и корпорация Microsoft. В ее
недрах была разработана парадигма .NET (.NET Framework), которая кладет в основу
своей идеологии представление любой программной системы как набора
взаимодействующих между собой в распределенной сетевой среде агентов, называемых
веб-сервисами (Web Services). Последние, в свою очередь, являются "черным
ящиком" для клиентов снаружи, предоставляя им доступ лишь к своему внешнему
интерфейсу и скрывая все детали реализации. При разработке приложений подобной
архитектуры возникает проблема организации первичного взаимодействия между
веб-сервисом и его клиентом, результатом которого должно стать получение
клиентом информации об услугах, предоставляемых веб-сервисом, и способах
обращения к ним. Для решения этой проблемы фирмами Microsoft, IBM и Ariba был
разработан Язык описания веб-сервисов (Web Service Description Language, WSDL),
кратким введением в который и является данная статья.
Отметим в первую очередь, что каждый документ WSDL является (по определению)
документом XML. Эта особенность представляется очень логичной и удобной ввиду
широкого распространения последнего как универсального формата хранения данных.љ
Опишем вкратце структуру WSDL документа (иногда называемого также
контрактом; мы тоже будем использовать данный термин).
Контракт описывается в следующих терминах:
- Типы
- Сообщения
- Типы портов
- Привязки
- Порты
- Сервисы
В каждое из этих понятий вкладывается вполне определенный смысл. Приведем
соответствующие определения:
- Типы - это понятия, в терминах которых описываются сообщения
- Сообщения - это абстрактные представления передаваемых данных. Сообщения
состоят из нескольких элементов, с каждым из которых связан некоторый тип
данных в некоторой системе типов
- Типы портов - это наборы абстрактных операций, производимых на входящими и
исходящими сообщениями
- Привязки определяют конкретные протокол и формат данных для операций,
введенных конкретным типом порта
- Порты вводят адреса для привязок, определяя тем самым точку входа для
внешних каналов связи
- Сервисы - это наборы взаимосвязанных портов
Приведем примеры использования каждого из описанных понятий. Мы постараемся
описать контракт простейшего сервиса, который в ответ на запрос выдает некий
ответ. Большинство веб-сервисов, которые разработчикам придется создавать на
первых порах, будет, вероятно, организовано столь же просто или будет
распадаться на несколько взаимодействующих веб-сервисов с аналогичным
контрактом. При этом внутренняя структура может быть сколь угодно сложной,
внешний же интерфейс может по-прежнему описываться достаточно простым
образом.
<types>
<schema targetNamespace="http://sitename.com/questionanswer.xsd"
xmlns="http://www.w3.org/1999/XMLSchema">
<element name="Request">
<complexType>
<all>
<element name="contents" type="int"/>
</all>
</complexType>
</element>
<element name="Response">
<complexType>
<all>
<element name="contents" type="float"/>
</all>
</complexType>
</element>
</schema>
</types> |
На этом примере видно, как при помощи XMLSchema определяются несколько новых
типов данных (в нашем случае два).
<message name="RequestInformation">
<part name="body" element="xsd1:Request"/>
</message><message name="ReplyForRequest">
<part name="body" element="xsd1:Responce"/>
</message> |
В этом фрагменте описаны два сообщения, одно из которых представляет собой
запрос на получение некой информации, а второе - ответ на этот запрос. Каждое из
сообщений содержит некоторые данные с типами, определенными ранее.
<portType name="RequestResponcePortType">
<operation name="RequestResponceOperation">
<input message="tns:RequestInformation"/>
<output message="tns:ReplyForRequest"/>
</operation>
</portType> |
Здесь представлено описание абстрактного порта, с которым можно производить
единственную операцию: запросить цену товара. Эта операция состоит из получения
входного сообщения и посылки ответа на него. Оба этих действия (для удобства
разработчика) могут рассматриваться как единая операция.
<binding name="RequestResponceBinding" type="tns:RequestResponcePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="RequestResponceOperation">
<soap:operation soapAction="http://sitename.com/RequestResponceOperation"/>
<input>
<soap:body use="literal" namespace="http://sitename.com/questionanswer.xsd"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="literal" namespace="http://sitename.com/questionanswer.xsd"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
|
Данный фрагмент описывает привязку типа порта к протоколу (в данном случае
SOAP). Здесь определяется, как на уровне протокола должна осуществляться посылка
и прием сообщений.
<service name="RequestResponceService">
<documentation>A sample service</documentation>
<port name="RequestResponcePort" binding="tns:RequestResponceBinding">
<soap:address location="http://sitename.com/requestresponce"/>
</port>
</service> |
И, наконец, здесь определяется порт и сервис с кратким документирующим
пояснением.
Обязательным элементом синтаксиса WSDL являются пространства имен XML. Это
требование обусловлено расширяемостью WSDL, на основе которой строится поддержка
различных физических протоколов (в частности, стандартно определены расширения
для SOAP 1.1, HTTP GET/POST и MIME). Расширяемость также используется для
поддержки различных систем типов.
Некоторых дополнительных пояснений требует понятие типа порта. Тип порта -
это набор связанных с ним абстрактных операций. Эти операции определяются в
терминах посылаемых и принимаемых сообщений. Физические аспекты процесса приема
и передачи при этом не затрагивается. Используемые протоколы определяются в
привязках, а конкретные адреса - в портах. Такое разделение необходимо прежде
всего для реализации повторного использования фрагментов WSDL документов.
В определениях привязок стандартно можно использовать ссылки на протоколы
SOAP, HTTP GET/POST и MIME. Система типов может быть легко создана на основе XML
Schema. Задача разработчика, таким образом, четко разделяется на части.
Некоторые (а в идеале все) фазы генерации контракта могут быть выполнены
машинным путем при создании веб-сервиса. Существующие приложения не поддерживают
такую возможность, однако в перспективе этот процесс будет полностью
автоматизирован.
Таким образом, документ WSDL полностью описывает интерфейс веб-сервиса со
внешним миром. Единственной проблемой остается поиск веб-сервисов и их
контрактов для решения конкретных задач. Для этого был разработан протокол UDDI.
За дополнительной информацией мы отсылаем читателя к другим статьям на dotSITE, а также к фирменной
документации от Microsoft.