27
Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB Малышкин Фёдор ([email protected] ) 9 ноября 2007

Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Embed Size (px)

DESCRIPTION

Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Citation preview

Page 1: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Малышкин Фёдор ([email protected])

9 ноября 2007

Page 2: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Введение

Веб-сервис – это метод коммуникации с использованием огромного количества протоколов и данными в виде структурированного XML.

Название пошло от основного протокола передачи, использовавшегося на заре создания технологии – HTTP.

Сейчас в качестве протоколов передачи кроме HTTP, могут использоваться JMS (протокол передачи сообщений Java), SMTP, TCP…

Даже данные могут передаваться не в виде XML. Так что понятие «веб-сервис» имеет очень расплывчатое

значение на сегодняшний день и включает в себя огромное количество понятий.

Но разговор будет идти о стандарте описания веб-сервиса – о WSDL…

Page 3: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

WSDL

WSDL – Web Service Description Language. WSDL является XML словарём, который позволяет

описать веб-сервис в языке независимом от платформы и от реализации.

Данная лекция описывает стандарт WSDL 1.1, который доступен по адресу [TODO].

Page 4: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Логическая структура WSDL

<wsdl:definitions ....> <!– Импорт определений из других источников --> <wsdl:import ..../> <!– Определение типов используемых только в этом WSDL --> <wsdl:types ..../> <!– Определение сообщений используемых веб-сервисом --> <wsdl:message .../> <!– Определение интерфейсов и операций --> <wsdl:portType .../> <!– Привязка интерфейсов и операций к конкретному протоколу --> <wsdl:binding ..../> <!– Определение сервиса как коллекции интерфейсов и определение

адреса сервиса --> <wsdl:service ..../></wsdl:definitions>

Page 5: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

import – позволяет частям веб-сервиса быть распределёнными между несколькими файлами и быть скомпонованными в различной конфигурации в зависимости от потребностей авторов веб-сервиса.

Использование данной техники распространено в крупных проектах, многие веб-сервисы имеют общие типы данных и отличаются только в деталях реализации или привязки к протоколу.

Page 6: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

types – определяет типы используемые веб-сервисами.<types><xs:complexType name="requestHeaderType">

<xs:all><xs:element name="sessionId" type="xs:string">

</xs:all></xs:complexType><xs:complexType name="responseHeaderType">

<xs:all><xs:element name="sessionId" type="xs:string"></xs:element>

</xs:all></xs:complexType>…..

Page 7: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

types – определяет типы используемые веб-сервисами.

Page 8: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

message - описывает данные, которые путешествуют между веб-сервисом и клиентом в терминах, описанных в элементе Types.

<message name="startSessionRequest"><part name="request" element="tns:startSessionRequest"/>

</message><message name="startSessionResponse">

<part name="response" element="tns:startSessionResponse"/></message><message name="getRegionImageRequest">

<part name="request" element="tns:getRegionImageRequest"/></message>…

Page 9: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

portType – определяет опреации, которые веб-сервис обеспечивает.

<portType name="GPSMonitorScreenProjectionEndpoint"><operation name="startSession">

<input message="tns:startSessionRequest"/><output message="tns:startSessionResponse"/>

</operation><operation name="addRoute">

<input message="tns:addRouteRequest"/><output message="tns:addRouteResponse"/><fault name="fault" message="tns:addRouteFault"/>

</operation>…

Page 10: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

binding – определяет, как операции и сообщения, описанные в message и portType, привязываются к конкретному протоколу.

<binding name="GPSMonitorScreenProjectionEndpointBinding" type="tns:GPSMonitorScreenProjectionEndpoint"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/><operation name="startSession">

<soap:operation/><input><soap:body use="literal"/></input><output><soap:body use="literal"/></output>

</operation><operation name="addRoute"><soap:operation/>

Page 11: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Элементы WSDL

service – группирует ранее описанные порты и этим определяет сервис.

<service name="GPSMonitorScreenProjectionService"><port name="GPSMonitorScreenProjectionEndpointPort" binding="tns:GPSMonitorScreenProjectionEndpointBinding">

<soap:address location="http://mg-sv01/"/></port>

</service>

Page 12: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Разработка «обычных» веб-сервисов

Класс Java:

@WebServicepublic class UsualWS {

@WebMethodpublic String method01(String data) {

// парсинг XML// работа над даннымиString result = результат работыreturn result;

}}

Page 13: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Разработка «обычных» веб-сервисов

Генерация с помощью WSGEN необходимых артефактов и WSDL

Развёртывание И вызов через клиента или другое средство. Например

через XMLSpy:

Page 14: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Потери «обычных» веб-сервисов

«Обычные» веб-сервисами отличаются от «нормальных» только одним – отсутствием информации о структуре передаваемого XML.

Информация о том, что передаётся и в каком виде, должна быть у пользователя веб-сервиса ЗАРАНЕЕ. Использовать веб-сервис без этого не предоставляется возможным.

Page 15: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Пример «стандартного» веб-сервиса

Загружаем WSDL «нормального» веб-сервиса в XMLSpy и пробуем вызвать.

Page 16: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Преимущества «стандартных»веб-сервисов

Доступ к информации о структуре XML на стадии анализа веб-сервиса.

Чёткое описание веб-сервиса на уровне интерфейсов взаимодействия.

Возможность генерации клиента другим программистом независимо от автора.

Совместимость клиента и сервиса (изменении сервиса в рамках допустимого).

Возможность генерации специальных класса для указанных типов, облегчающих работу с XML.

Устранение необходимости работы экранирования строк, на наличие служебных символов.

Page 17: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Пример сгенерированного клиента для «стандартного» веб-сервиса

@WebMethod@WebResult(name = "addRouteResponse", targetNamespace =

"http://gpsmonitor.net.magnetosoft.ru/", partName = "response")public AddRouteResponseType addRoute(@WebParam(name =

"addRouteRequest", targetNamespace = "http://gpsmonitor.net.magnetosoft.ru/", partName = "request")

AddRouteRequestType request) throws AddRouteFault;

@WebMethod@WebResult(name = "getScaleResponse", targetNamespace =

"http://gpsmonitor.net.magnetosoft.ru/", partName = "response")public ScaleResponseType getScale(@WebParam ( name =

"getScaleRequest", targetNamespace = "http://gpsmonitor.net.magnetosoft.ru/", partName = "request")

GetScaleRequest request) throws GetScaleFault;

Page 18: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Пример сгенерированного клиента для «стандартного» веб-сервиса

Каждый метод имеет в качестве параметров и возвращаемого результат сгенерированные классы, обрамлённые JAXB аннотациями.

При вызове метода классы с наполненными данными преобразуются в XML, а результат из XML разбирается в те же сгенерированные классы.

Как результат - необходимость работы с XML, переносящимся между веб-сервисами, отпадает полностью.

Page 19: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 1.

Создание WSDL Генерация артефактов с помощью WSIMPORT Создание реализации сгенерированного интерфейса

сервиса

P.S.: Данный вариант детально не рассматривается, так как требует детального знания языка описания XML – «XML Schema». Именно на его основе сделаны модули «Search», «Catalogue» платформы MAGNET.

Page 20: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 2.

Создание классов носителей-данных для обмена. Классы носители-данных для обмена являются обычными JavaBean’ами, с аннотациями JAXB, которые определяют в какой XML они превратятся.

package edu.sefer.home.ws;import java.math.BigDecimal;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class XmlResult {

@XmlElementint result;@XmlElementBigDecimal resultBD;

}

Page 21: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 2.

package edu.sefer.home.ws;import java.util.Date;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class XmlData {

@XmlElementString inputString;

@XmlElementDate inputDate;

@XmlElementint inputInt;

}

Page 22: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 2.

Создания класса веб-сервиса, подобно обычному подходу, но с входящими и выходящими параметрами в виде классов носителей-данных.

package edu.sefer.home.ws;import javax.jws.WebMethod;import javax.jws.WebService;@WebServicepublic class UsualWS {

@WebMethodpublic XmlResult method01(XmlData data) {

return null;}

}

Page 23: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 2.

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

<wsgen verbose="false" debug="true" keep="true" destdir="${project.build.outputDirectory}" resourcedestdir="${basedir}/target/wsdl" sourcedestdir="${project.build.sourceDirectory}" sei="edu.sefer.home.ws.UsualWS" genwsdl="true"><classpath>

<path refid="jwdp.classpath"/><pathelement

location="${project.build.directory}/classes"/></classpath>

</wsgen>

Page 24: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 2.

Развёртывание и вызов…

Page 25: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Создание «стандартного» веб-сервиса. Вариант 3.

Генерация или создание WSDL схемы вручную. Использование интерфейса «javax.xml.ws.Provider» на

серверной стороне Использование интерфейса «javax.xml.ws.Dispatch» на

клиентской стороне Использование типа «xsd:anyType» для описания

ЛЮБОГО XML, если его структура не зафиксирована.

P.S.: Данный вариант детально не рассматривается, так как требует детального знания языка описания XML – «XML Schema» и деталей работы соответствующих интерфейсов. Но именно на его основе сделан модуль «EntityManager» платформы MAGNET.

Page 26: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Выводы

Варианты 1 и 2 наиболее удобны, если интерфейсы взаимодействия уже оговорены и устоялись.

Вариант же 3 позволяет передавать динамически компонуемый XML максимально быстро и использовать его максимально эффективно и гибко.

Хотя надо так же заметить, что при использовании некоторых подходов, передавать динамический XML можно и в вариантах 1 и 2. Но надо заметить, что дополнительная нагрузка (на обработку сообщений на уровне самой библиотеки) при этом возрастает многократно.

Page 27: Технология создания веб-сервисов на базе стандарта JAX-WS & JAXB

Вопросы?

?