Разработка веб-служб средствами Java. Ильдар ХабибуллинРазработкаWebслужбсредствами
Скачать 9.24 Mb.
|
Глава 3. Протокол SOAP и Web Services /> /> name="handlerClass" /> Разработка Web-служб средствами Java Конфигурационный DD-файл запоминается обычно под именем deploy.wsdd. После его создания надо перейти в каталог с этим файлом и выполнить команду $ deploy.wsdd Класс установит описанную Web-службу в Axis. На консоли появятся сообщения Processing f i l e deploy.wsdd После этого клиент может обратиться к Web-службе, воспользовавшись ее адресом например, С помощью утилиты AdminClient можно просмотреть описания всех Web- служб, установленных на данной машине. Для этого надо набрать команду $ list Для удаления Web-службы из Web-контейнера создается файл undeploy.wsdd. Он похож на DD-файл, но корневым элементом служит элемент Кроме установки Web-службы в Web-контейнер, утилита AdminClient соз- дает все необходимые для ее работы файлы, в том числе клиентские за- глушки. Пример клиента, использующего их, приведен в листинге 3.18. Использование описаний WSDL Конфигурационный DD-файл записывается в формате, специально разра- ботанном для Axis. Такой файл не переносим в другие системы обеспечения Web-служб. Но в Axis можно использовать и другое средство описания Web- служб — язык WSDL. В своей работе Axis широко использует описания WSDL (см. главы 2, 4), даже если вы их не сделали. Наберите в браузере Internet Explorer строку и вы увидите в окне брау- зера описание Web-службы сделанное на языке WSDL. Оно сгенерировано автоматически методами класса Создание WSDL-файла по классу Java По имеющемуся откомпилированному классу или интерфейсу Axis может создать его описание на языке WSDL. Для этого в составе Axis есть класс Он работает из командной строки примерно так: $ -o echo.wsdl \ -l"http://localhost:8080/axis/services/echo" \ -n "urn:echo" -p"echoservice" urn:echo EchoService Глава 3. Протокол SOAP и Web Services В этой командной строке за флагом -о записывается имя создаваемого WSDL-файла echo.wsdl. За флагом -1 идет URI, последнее имя которого, echo, будет именем порта в WSDL-файле. За флагом -п стоит идентификатор пространства имен WSDL-файла За флагом -р расположены два параметра через пробел: параметр echoservice — это имя пакета, а параметр — идентификатор про- странства имен. Наконец, последнее имя в командной строке — это имя клас- са, для которого создается описание WSDL. В результате выполнения этой команды в текущем каталоге создается файл echo.wsdl с описанием WSDL класса Echoservice. Создание Web-службы по WSDL-файлу По имеющемуся описанию Web-службы на языке WSDL можно построить Web-службу с помощью класса Для этого надо набрать в ко- мандной строке следующее: $ -o . -d Session -s \ -p echo.ws echo.wsdl В этой командной строке флаг -о указывает каталог, в который надо помес- тить создаваемые файлы. В данном случае это текущий каталог. На это ука- зывает точка, следующая за флагом -о. Флаг -d определяет продолжительность работы Web-службы одним из трех слов: • Application — один экземпляр Web-службы обслуживает все запросы; Request — для обслуживания каждого запроса создается свой экземпляр Web-службы (по умолчанию); • — экземпляр Web-службы образует сеанс связи с клиентом. Флаг -s указывает на то, что следует создать все файлы, необходимые для работы сервера Web-службы. За флагом -р идет имя пакета echo.ws, в котором будут лежать создаваемые классы. Наконец, последнее слово в командной строке — это имя WSDL-файла echo.wsdl. Разработка Web-служб средствами Java Команда создаст в текущем каталоге echo подкаталог ws, а в нем множество файлов, образующих заглушки, скелетоны и вспомогательные файлы, необходимые для работы удаленного объекта системы В их числе есть и конфигурационные DD-файлы и undeploy.wsdd. Среди этих файлов находится файл в кото- ром надо реализовать методы Web-службы, как это обычно делается в сис- теме RMI [10]. Удаленный интерфейс системы RMI заносится в файл EchoServicePortType.java, а его клиентская заглушка — в файл Клиент создает заглушку методом getEchoServicePort о класса-фабрики, записанного в файл EchoService.java. После того как это сделано, надо откомпилировать все файлы в каталоге echo/ws: $ Потом перейти в каталог ws и установить созданную Web-службу в сервер приложений: $ Сеанс связи с Axis Еще одна интересная особенность Axis — он может установить сеанс связи с клиентом. Сеанс связи описан интерфейсом session, реализованным дву- мя классами — классом работающим через заголовок SOAP- послания, и классом AxisHttpSession, создающим сеанс связи через серв- лет при помощи cookie [10]. В первом случае в заголовок SOAP-послания записывается блок содержащий уникальный идентификатор сеанса. Все дейс- твия по его записи и проверке выполняются методами класса И в клиенте и в сервере должно находиться по эк- земпляру этого класса. Во втором случае обычным образом записываются и проверяются поля set- И Cookie [10] HTTP-заголовка. Методы сеанса Интерфейс описывает метод public void key, Object value); задающий идентификатор сеанса key со значением value. Глава 3. Протокол SOAP и Web Services Все идентификаторы сеанса можно получить методом public Enumeration а значение отдельного идентификатора key — методом public Object key); Идентификатор key удаляется методом public void key); Сеанс завершается, когда в течение времени timeout, определенного методом public void timeout); не было выполнено ни одного действия. Время отсчитывается в секундах. Узнать это время можно методом public int Если надо продлить сеанс, то можно воспользоваться еще одним методом public void интерфейса Этот метод "помечает" сеанс связи, сообщая, что он только что использовался. Класс simplesession реализует все методы интерфейса session, добавляя к ним конструктор по умолчанию, начинающий сеанс связи, и метод public long ; возвращающий время последнего действия в сеансе. Класс AxisHttpSession работает в сервлетах в рамках сеанса класса экземпляр которого передается или записывается прямо в конструкторе public session); или косвенно, через запрос req, в конструкторе public req); Поэтому, кроме методов интерфейса session, в нем есть методы доступа к сеансу сервлета public void session); public HttpSession Создание сеанса средствами Axis Хотя разработчик может "вручную" создать сеанс связи с Web-службой ме- тодами классов И AxisHttpSession, В Axis есть средства, ав- Разработка Web-служб средствами Java томатизирующие этот процесс. Рассмотрим простейший пример Web- службы, которая при первом обращении к ней запоминает имя клиента и использует его в дальнейшей работе с тем же клиентом. Эта Web-служба приведена в листинге 3.17. * Листинг 3.17. Web-служба, использующая сеанс связи public class private String lastName = " " ; public String name){ String resp = " " ; if resp = "Рады снова видеть Вас, "; else resp = "Здравствуйте, "; lastName = name; return resp + name + "\n"; Для того чтобы Axis организовал сеанс связи с Web-службой не создавая при каждом обращении к ней новый экземпляр, в ее конфигу- рационном файле надо записать элемент , дающий значение "Session" параметру "scope": /> Глава 3. Протокол SOAP и Web Services 181 Если Web-служба создается по ее описанию WSDL, то достаточно при вы- зове утилиты записать параметр -d session, как это сделано в примере использования этой утилиты, приведенном выше. Это еще не все. Сервер создаст сеанс связи только по прямому указанию клиента. Указание дается обращением к методу public void session); класса-заглушки stub, реализующего в Axis одноименный интерфейс систе- мы Axis, точнее, утилиты или автомати- чески создают расширение класса stub, в нашем примере имя этого расши- рения — Все вместе выглядит так, как пока- зано в листинге 3.18. Клиент, записанный в листинге 3.18, пользуется Web-услугой sayHelloO два раза. Первый раз Web-услуга говорит ему: "Здравствуйте, ", второй раз — "Рады снова видеть Вас, ". ; Листинг Клиент Web-службы, создающий сеанс связи public class public static void args){ String name ""; if (args[0] != null) name = args[0]; // Класс-фабрика HelloSession создан утилитой HelloSession fact = new HelloSessionPortType service = HeiioSessionSoapBindingStub stub = (HeiioSessionSoapBindingStub)service; Web-служб средствами Java e){ ГЛАВА 4 Описание Web Services на языке WSDL В главе 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 Корневым элементом документа — описания WSDL — служит эле- мент Описания WSDL активно используют различные пространства имен. Кро- ме собственных имен, язык WSDL часто использует имена типов и эле- 184 Разработка Web-служб средствами Java ментов языка описания схем XSD главу 1) и имена языка протокола SOAP. Пространство имен языка WSDL часто описывается как простран- ство имен по умолчанию. Идентификатор пространства имен последней на время написания этих строк версии WSDL 1.2 был равен http://www.w3.org/2002/07/wsdl. Целевое пространство имен, идентифика- тор которого определяется атрибутом обычно получает префикс tns (target namespace). В корневой элемент • • , описы- вающие неделимые с точки зрения WSDL части послания. Для посланий процедурного типа каждый элемент может описывать имя и тип одного аргумента запроса или тип возвращаемого значения. Для посла- ний документного типа элементы могут описывать каждую часть послания "multipart/related". Это абстрактное описание затем конкретизируется элементами • — описывает интерфейс Web-службы, называемый в языке WSDL пунктом назначения (endpoint) или портом (port) прибытия посла- ния. Он описывается как набор Web-услуг, называемых в языке WSDL операциями. Переводя это описание на язык программирования можно заметить, что порт хорошо соотносится с интерфейсом Java, а каждая операция — с методом этого интерфейса. Операции описываются вло- женными элементами и два комбинированных действия: "отправка послания — получение от- вета" или, наоборот, "получение послания — отправка ответа". Получе- ние и отправка, в свою очередь, описываются вложенными элементами и а сообщение об ошибке — элементом По- лучаемые и отправляемые послания уже должны быть описаны элемен- тами Глава 4. Описание Web Services на языке WSDL 185 • • • , содержащим адрес интерфейса Web-службы, заданный по пра- вилам выбранного в элементе Кроме этих шести основных элементов есть еще два вспомогательных эле- мента. • WSDL-файл. — комментарий. Его можно включить в любой элемент описания WSDL. Можно сказать, что элементы как организованы услуги, какие типы данных у этих услуг. Элементы Наконец, элементы связывая описание Структура документа WSDL показана в листинге 4.1. Символы в квадратных скобках не содержатся в документе. Они показывают повторяемость эле- мента или атрибута в описании Web-службы: • символ [?] означает, что элемент или атрибут может появиться в доку- менте нуль или один раз; • символ [*] означает, что элемент может появиться нуль или несколько раз; • символ [+] означает, что элемент может появиться один или несколько раз; • отсутствие символа в квадратных скобках означает, что атрибут должен появиться ровно один раз. 186 Разработка Web-служб средствами Java j Схема 1 version="1.0" ?> [?] пространства имен" пространства имен" [*] > пространства имен" /> [*] [?] Произвольный комментарий [?] [?] Описания сложных и нестандартных записывается описание сложных типов —> ion> [?] Абстрактное описание SOAP-послания как набора составляющих его частей. пате="имя части (аргумента метода)" элемента" [?] аргумента" [?] /> [*] Глава 4. Описание Web Services на языке 187 [*] [?] Абстрактное описание как набора операций (услуг). пате="имя услуги"> [*] [?] Описание услуги как получения (input) и отправки (output, fault) посланий. ion> соотв. элемента [?] Получаемое послание. соотв. элемента Отправляемое пате="имя" соотв. элемента [?] Отправляемое сообщение об operation пате="имя"> [*] Разработка Web-служб средствами Java соотв. элемента "/> [+] соотв. элемента "> [*] . . . / > [ ? ] Сюда записываются элементы, описывающие детали конкретного протокола. Они определяются в схеме этого протокола. пате="имя"> [*] . . . / > [ ? ] Сюда записываются элементы, описывающие детали конкретной операции. [? ] . . . / > [ ? ] Сюда записываются элементы, описывающие детали конкретного получаемого послания. [?] . . . / > [ ? ] Глава 4. Описание Web Services на языке WSDL Сюда записываются элементы, описывающие детали конкретного отправляемого послания. [*] . . . /> [?] — Сюда записываются элементы, описывающие детали конкретного сообщения об соотв. элемента [?] Описание интерфейса Web-службы как набора портов. . . . / > [ ? ] Сюда записывается обязательный и единственный адрес интерфейса Web-службы, записанный по правилам протокола, указанного в элементе 190 Разработка Web-служб средствами Java Каждый конкретный протокол пересылки посланий — SOAP, HTTP, FTP, SMTP — добавляет к шести основным и двум вспомогательным элементам языка WSDL свои дополнительные элементы, описывающие особенности данного протокола. Приведем простой пример. В листинге 3.14 мы записали в виде класса Java простейшую Web-службу, возвращающую без всякой обработки присланный запрос: public class public String req){ return req; В листинге 4.2 приведено описание этой Web-службы на языке WSDL, ис- пользующее протокол SOAP. Листинг 4.2. Описание Web-службы EchoService version="1.0" ?> name="getEchoResponse"> /> Глава 4. Описание Web Services на языке 191 /> /> soapAction="" /> use="encoded" /> Разработка Web-служб средствами Java В листинге 4.2 мы в элементе Мы дали ИМ "getEchoRequest" И "getEchoRe- sponse". В запросе один аргумент типа string. Этот тип определен в языке XSD. Мы дали аргументу имя req, совпадающее с именем аргумента метода . Значению, возвращаемому методом, мы дали имя return, его тип тоже xsd: string. Имена "getEchoRequest" И "getEchoResponse" ИСПОЛЬЗОВаны В следующем элементе для указания входных и выходных параметров Web- услуги. В вложен один элемент Глава 4. Описание Web Services на языке WSDL В листинге 4.2 имена с префиксом soap конкретизировали описание посла- ния и способы его пересылки. Посмотрим, какие конкретные протоколы предлагает спецификация WSDL 1.2. Конкретизация описания WSDL Спецификация WSDL 1.2 задает правила описания адреса Web-службы и предоставляемых ею услуг для протокола SOAP, методов GET и POST про- токола HTTP и — для пересылки документов с различными МШЕ-типами. Эти правила записываются дополнительными элементами XML, специфич- ными для каждого протокола. Дополнительные элементы протокола SOAP При использовании протокола SOAP в элемент , документа WSDL вкладывается несколько дополнительных элементов. Для версии WSDL 1.2 они определены в пространстве имен с идентификатором Будем считать, что префиксом имен из этого пространства выбрано слово soap. Непосредственно в элемент В элемент — вкладывается необязательный элемент В элементы и 194 Разработка Web-служб средствами Java Значение "encoded" атрибута use говорит о том, что послание использует способы сериализации, описание которых надо искать через атрибуты type, namespace И Значение "literal" атрибута use указывает, что способы сериализации опре- делены в схеме документа. В элемент , вложенный в элемент Примеры всех этих элементов уже приведены в листинге 4.2. В следующем листинге 4.3 показана схема расположения элементов протокола SOAP (они помечены префиксом soap) внутри элементов WSDL. Символы в квадрат- ных скобках имеют то же значение, что и в листинге 4.1. . Листинг 4.3. Схема вложенности элементов протокола SOAP .... > [?] transport="cTpoKa URI" /> .... > URI" [?] [?] /> [?] [ header u s e = " l i t e r a l encoded" encoding [?] [?] Глава 4. Описание Web Services на языке WSDL 195 use="literal encoded" use="literal | encoded" [?] URI" [ encoded" URI" [?] [?] | encoded" URI" encoded" URI" 196 Разработка Web-служб средствами Java в виде строки /> Дополнительные элементы протокола HTTP Дополнительные элементы протокола HTTP определены в пространстве имен с идентификатором http://www.w3.org/2002/07/wsdl/http. Будем счи- тать, что этим именам дан префикс http. Для описания пересылки посланий по протоколу HTTP вводятся три до- полнительных элемента. Элемент |