Главная » Java, Web, XML » Описание Web Services на языке WSDL

0

В главе 2 мы говорили о том, что после создания Web-службы на сервере в виде сервлета, страницы JSP, JWS-файла, компонента EJB или другого объекта, следует описать состав и возможности Web-службы на языке, не зависящем от платформы, операционной системы, системы программирования, использованной при создании Web-службы. Это описание регистрируется в общедоступном месте Интернета, например, реестре UDDI или ebXML, или хранится на сервере Web-службы. Описание должно содержать полную и точную информацию обо всех услугах, предоставляемых Web-службой, способы получения услуг, содержимое запроса на получение услуги, формат предоставляемой информации.

Одно из средств точного и единообразного описания Web-услуг — язык WSDL, созданный консорциумом W3C. Этот язык — еще одна реализация XML. Его последняя рекомендованная спецификация всегда публикуется на странице http://www.w3.org/TR/wsdI. Во время написания книги на черновой стадии была версия WSDL 1.2, которую мы и опишем в этой главе.

Состав документа WSDL

Корневым элементом документа XML — описания WSDL — служит элемент <definitions>. В этом элементе необязательным атрибутом name можно дать имя описанию. Кроме того, это удобное место для введения используемых в описании пространств имен.

Описания WSDL активно используют различные пространства имен. Кроме собственных имен, язык WSDL часто использует имена типов и элементов языка описания схем XSD (см. главу 1) и имена языка протокола SOAP. Пространство имен языка WSDL часто описывается как пространство имен по умолчанию. Идентификатор пространства имен последней на время написания этих строк версии WSDL 1.2 был равен http://www.w3.org/2002/07/wsdl. Целевое пространство имен, идентификатор которого определяется атрибутом     обычно получает префикс tns (target namespace).

В корневой элемент <definitions> вкладываются элементы шести основных и двух дополнительных типов. Все элементы необязательны, их может быть любое количество, за исключением элемента <types>, который может встретиться в документе только один раз. У каждого элемента есть имя, определяемое обязательным атрибутом name. Элементы ссылаются друг на друга с помощью этих имен. Вот элементы, вкладываемые в корневой элемент

?         <types> — определяет сложные типы, используемые Web-службой, с помощью языка XSD или другого языка описания типов. Этот элемент не нужен, если Web-служба применяет только простые типы, описанные в языке XSD.

?         <message> — описывает каждое SOAP-послание: запрос, ответ, пересылку документов. В этот элемент вкладываются элементы <part>, описывающие неделимые с точки зрения WSDL части послания. Для посланий процедурного типа каждый элемент <part> может описывать имя и тип одного аргумента запроса или тип возвращаемого значения. Для посланий документного типа элементы <part> могут описывать каждую часть послания "multipart/related". Это абстрактное описание затем конкретизируется элементами <binding>.

?         <portType> — описывает интерфейс Web-службы, называемый в языке WSDL пунктом назначения (endpoint) или портом (port) прибытия послания. Он описывается как набор Web-услуг, называемых в языке WSDL операциями. Переводя это описание на язык программирования можно заметить, что порт хорошо соотносится с интерфейсом Java, а каждая операция — с методом этого интерфейса. Операции описываются вложенными элементами <operation>, описывающими каждую отдельную услугу. Услуга описывается действиями, которые разбиты на четыре вида. Это два простых действия: "получение послания", "отправка ответа", и два комбинированных действия: "отправка послания — получение ответа" или, наоборот, "получение послания — отправка ответа". Получение и отправка, в свою очередь, описываются вложенными элементами <input> и <output>, а сообщение об ошибке — элементом <fault>. Получаемые и отправляемые послания уже должны быть описаны элементами <message>, элементы <input>, <output> И <fault> ссылаются на НИХ СВОИМ атрибутом message.

?         <serviceType> — перечисляет вложенными элементами <portType> набор портов, связанных с одной Web-службой. Один и тот же порт может быть связан с несколькими службами.

?         <binding> — описывает конкретный формат пересылки послания: протоколы, такие как SOAP или HTTP, способы упаковки послания, тип его содержимого: HTML, XML или другой MIME-тип послания. Каждый элемент      может быть связан с несколькими такими элементами, по одному для каждого способа пересылки. В этот элемент вкладываются элементы, определенные в схеме выбранного протокола.

?         < service > — указывает местоположение Web-службы как один или несколько портов. Каждый порт описывается вложенным элементом <port>, содержащим адрес интерфейса Web-службы, заданный по правилам выбранного в элементе <binding> способа пересылки.

Кроме этих шести основных элементов есть еще два вспомогательных элемента.

?         <import> — включает файл с XSD-схемой описания WSDL или другой WSDL-файл.

— комментарий. Его можно включить в любой элемент

описания WSDL.

Можно сказать, что элементы <types>, <message> и <portType> показывают, ЧТО есть в описываемой Web-службе, какие услуги она предоставляет, как организованы услуги, какие типы данных у этих услуг.

Элементы <binding> объясняют, КАК реализована Web-служба, каков протокол передачи посланий: HTTP, SMTP или какой-то другой, а также задает технические характеристики передачи данных.

Наконец, элементы <service> показывают, ГДЕ находится Web-служба, связывая описание <binding> с конкретными адресами Web-службы.

Структура документа WSDL показана в листинге 4.1. Символы в квадратных скобках не содержатся в документе. Они показывают повторяемость элемента или атрибута в описании Web-службы:

?         символ [?] означает, что элемент или атрибут может появиться в документе нуль или один раз;

?         символ [*] означает, что элемент может появиться нуль или несколько раз;

?         символ [+] означает, что элемент может появиться один или несколько раз;

?         отсутствие символа в квадратных скобках означает, что атрибут должен появиться ровно один раз.

j Листинг 4.1. Схема WSDL-документа

<?xml version="1.0" ?>

<wsdl:definitions пате="имя" [?]

targetNamespace="nfleHlra«iij<iKaTop пространства имен" xmlns:префикс="идентификатор пространства имен" [*] >

<import патезрасе="идентификатор пространства имен"

location="URI-aflpec" /> [*]

[?]

Произвольный комментарий

</wsdl:documentation>

[?]

[?]

Описания сложных и нестандартных типов. </wsdl: documentation

<xsd:schema> [*]

<!—Здесь записывается описание сложный типов —> </xsd:schema>

</wsdl:types>

<wsdl:message пате="имя"> [*]

<wsdl;documentat ion> [? ]

Абстрактное описание SOAP-послания как набора составляющих его частей. </wsdl:documentation

<part пате="имя части (аргумента метода) " element="XSD-HMH элемента" [?] type="XSD-THn аргумента" [?] /> [*]

</wsdl:message>

<wsdl:portType пате="имя"> [*]

<wsdl: documentation [?]

Абстрактное описание Web-службы как набора операций (услуг). </wsdl:documentation>

<wsdl:operation пате="имя услуги"> [*]

<wsdl: documentation [?]

Описание услуги как получения (input) и отправки (output, fault) посланий. </wsdl:documentation>

<wsdl:input message="HMH соотв. элемента <message>"> [?]

[?]

Получаемое послание. </wsdl:documentation </wsdl:input>

<wsdl:output message="HMH соотв. элемента <message>"> [?] <wsdl:documentation> [?]

Отправляемое </wsdl:documentation </wsdl:output>

<wsdl:fault пате="имя"

message="nMH соотв. элемента <message>"> [*] [?]

Отправляемое сообщение об ошибке. </wsdl:documentation </wsdl:fault>

</wsdl: operation

</wsdl:portType>

<wsdl:serviceType пате="имя"> [*]

<wsdl:portType пате="имя соотв. элемента <portType>"/> [+] </wsdl:serviceType>

<wsdl:binding пате="имя"

type="MMH соотв. элемента <portType>"> [*]

<wsdl:documentation . . ./>[?]

<! —

Сюда записываются элементы, описывающие детали конкретного протокола. Они определяются в схеме

этого протокола. —>

<wsdl:operation пате="имя"> [*]

<wsdl:documentation . . ./>[?] <! —

Сюда записываются элементы, описывающие детали

конкретной операции. —>

[? ]

<wsdl:documentation . . ./>[?] <! —

Сюда записываются элементы, описывающие

детали конкретного получаемого послания. —>

</wsdl:input> <wsdl:output> [?]

<wsdl:documentation . . ./>[?]

<! —

Сюда записываются элементы, описывающие

детали конкретного отправляемого послания. —>

</wsdl:output»

<wsdl: fault паше="имя"> [*]

<wsdl:documentation . . . /> [?] <! —

Сюда записываются элементы, описывающие

детали конкретного сообщения об ошибке. —>

</wsdl:fault>

</wsdl:operation»

</wsdl:binding»

<wsdl:service пате="имя"

serviceType="MMH соотв. элемента <serviceType>"> [*]

<wsdl:documentation» [?]

Описание интерфейса Web-службы как набора портов. </wsdl:documentation»

<wsdl:port пате="имя"

binding="nMH соотв. элемента <binding>"> [*]

<wsdl: documentation . . ./>[?]

<! —

Сюда записывается обязательный и единственный адрес интерфейса Web-службы, записанный по правилам

протокола, указанного в элементе <binding>. —>

</wsdl:port> </wsdl:service> </wsdl:definitions>

Каждый конкретный протокол пересылки посланий — SOAP, HTTP, FTP, SMTP — добавляет к шести основным и двум вспомогательным элементам языка WSDL свои дополнительные элементы, описывающие особенности данного протокола.

Приведем простой пример. В листинге 3.14 мы записали в виде класса Java простейшую Web-службу, возвращающую без всякой обработки присланный запрос:

public class EchoService{

public String getEcho (String req) { return req;

}

}

В листинге 4.2 приведено описание этой Web-службы на языке WSDL, использующее протокол SOAP.

Листинг 4.2. Описание Web-службы EchoService

<?xml version="1.0" encoding="UTF-8" ?>

definitions

targetNamespace="http://echoservice.com/echoservice.wsdl" xmlns="http://www.w3.org/2002/07/wsdl" xmlns:tns="http://echoservice.com/echoservice.wsdl" xmlns:soap="http://www.w3.org/2002/07/wsdl/soapl2" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<message name="getEchoRequest">

<part name="req" type="xsd:string" />

</message>

<message name="getEchoResponse">

<part name="return" type="xsd:string" />

</message>

<portType name="EchoServicePort">

<operation name="getEcho">

<input message="tns: getEchoRequest" name="getEchoRequest" /> <output message="tns:getEchoResponse" name="getEchoResponse" />

</cperaticn>

</portType>

<birdling name="EchoServiceSoapBinding" type="tns:EchoServicePort"> <soap:binding style="rpc"

transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="getEcho">

<soap:operation soapAction="" />

<input name="getEchoRequest">

<soa^p:bccУ ^coGingSt^le=

"http://schemas.xmlsoap.org/soap/encoding/"

namespace= "http: //echoservice. ccm/echcservice .wsdl" use="encoded" />

</input>

<output name="getEchoResponse">

^oapKbocy enccdingStyle=

"http: //schemas .xmlsoap. org/soap/encoding/" namespace= "http: //echoservice. c^/ech^service .wsdl" use="encoded" />

</output>

</cperaticn>

</binding>

<service name="EchoServService">

<port binding="tns :EchoServiceSoapBinding" name="EchoService"> <soap:address location=

"http://localhost:8080/axis/EchoService.jws" />

</port> </service> </definitions>

В листинге 4.2 мы в элементе <definitions> определили префиксы всех нужных нам пространств имен. Далее мы описали запрос и ответ в двух элементах <message>. Мы дали ИМ имена "getEchoRequest" И "getEchoRe- sponse". В запросе один аргумент типа xsd: string. Этот тип определен в языке XSD. Мы дали аргументу имя req, совпадающее с именем аргумента метода getEcho () . Значению, возвращаемому методом, мы дали имя return, его тип тоже xsd: string.

Имена "getEchoRequest" И "getEchoResponse" ИСПОЛЬЗОВаны В следующем элементе <portType> для указания входных и выходных параметров Web- услуги. В него вложен один элемент <operation>. Это означает, что Web- служба предоставляет одну услугу, имя которой "getEcho" совпадает с именем метода, выполняющего эту услугу. В элементе                                    указаны входной <input> и выходной <output> параметры услуги. Затем, элементом <binding> мы указали один способ пересылки посланий — SOAP-послания в процедурном стиле, пересылаемые по протоколу HTTP, на что указывает элемент

<soap:binding style="rcp"

txarspcrt^=^"ht:tp^://?cheпas^.>пlscap^.c^rc^/?cap^/ht:tp^" />

Если применяется документный стиль SOAP, то в атрибуте style записывается значение "document".

Далее в элементе <binding> повторяется описание операции, но уже в терминах выбранного протокола SOAP.

Наконец, в элементе <service> вложенным элементом <port> связываем элемент <binding> с элементом <address>, указывающим адрес, по которому расположена Web-служба.

В листинге 4.2 имена с префиксом soap конкретизировали описание послания и способы его пересылки. Посмотрим, какие конкретные протоколы предлагает спецификация WSDL 1.2.

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии