WebServices

SOA - service orientired architecture

Причины использования веб-сервисов, позволяющих обеспечить взаимодействие разных систем на разных платформах.


 * Механизмы web-служб поддерживаются большим числом компаний
 * Можно организовать взаимодействие не только с внешними системами, но и внутренними
 * Используется xml в большинстве реализаций со всеми его преимуществами
 * Для описания используется wsdl
 * Для передачи сообщений используется saop
 * Многие IDE предоставляют возможность сгенерировать веб-сервисы автоматически

Для работы с веб-сервисами в java существует технология JAX-WS (Java API для xml web-сервисов).

Работа с xml осуществляется уже знакомой JAXB.

При работе с веб-сервисами необходимо преобразовать классы, написанные на java. Т.е. осуществляется маршализация.

SOAP - один из наиоболее часто используемых протоколов обмена структурированными сообщениями в распределенной вычислительной системе. SOAP может работать поверх различных протоколов прикладного уровня, чаще всего поверх http, но может и ftp, smtp и др.

В протоколе SOAP есть сообщения двух типов


 * Без присоединенного контента
 * С присоединенным контентом

Пример:   123

SOAP обычно состоит из SOAPHeader, SOAPBody, Attachments. При этом attachments содержит mime-type и само вложение (которое может быть не в формате xml).

Для работы с SOAP -сообщениями в Java есть пакет javax.xml.soap, предоставляющий все необходимые классы и интерфейсы.

Кроме SOAP, часто используется протокол REST (Representational State Transport). Ключевое отличие от SOAP заключается в том, что REST в запросе передает всю необходимую для выполнения этого запроса информацию (выполнение запроса не зависит от состояния сервиса). У REST предельно простой набор методов:

GET, POST, PUT, DELETE из методов http.

Основанная на REST архитектура построена из ресурсов, которые уникальным образом идентифицируются по URI. Сам протокол индепотентен (методы PUT, GET, ... можно выполнять какое угодно количество раз). К примеру, в SOAP может возникнуть ошибка, если команду выполнять несколько раз.

Может показаться, что методов REST недостаточно. Однако, часто этих методов достаточно. Однако есть специфика именно в работе по URI.

В REST нет необходимости специального описания (типа WSDL), т.к. всего 4 метода и они заранее известны.

Для реализации работы с веб-сервисом необходимо организовать серверную часть и клиентскую часть. Серверная часть называется конечной точкой. На WSDL описывается контракт, по которому взаимодействует конечная точка и клиент. Организовывать конечную точку можно двумя подходами:


 * 1) Вначале реализуются классы с логикой работы, а ide помогает сгенерировать описание на wsdl
 * 2) Вначале разрабатывается описание коненчой точки на wsdl, затем генерируются необходимые классы. (заглушки, реализацию придется писать самостоятельно).

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

Классом, который реализует веб-сервис, должен удовлетворять определенным ограничениям. Например, методы, которые потом будут предоставляться в качестве методов веб-сервиса не могут быть static или final и, конечно, должны быть public. Также они должны быть помечены аннотацией javax.jws.WebMethod.

Как правило, разрабатывают сразу класс и затем генерируют описание, но возможно разделить описание класса и интерфейса веб-сервиса. Такое может понадобиться если нужно взаимодействовать с веб-сервисами, находящимися по разным адресам, но реализует один интерфейс. Чтобы IDE знала что интерфейс не надо генерировать, надо передать аннотацию endpointInterface.

Еще пара ограничений: не может быть abstract, конструктор класса должен быть без параметров и быть public, также не может использоваться finilize. Метод, аннотиторванный @PreDestroy будет вызываться перед уничтожением, а @PostConstruct сразу после создания.

Для генерации wsdl описание по имеющемуся классу, используется утилита wsgen: wsgen -cp. org.bascom.jaxws.service.MathWebService

Если делать через netbeans, wsgen можно вызывать из контекстного меню. После генерации, можно будет посмотреть wsdl по адресу: http://localhost:8089/wsmath/MathOper?wsdl ,гду wsmath заменить на название приложения, MathOper на нужный класс. Схему можно получить по этому же адресу с параметром в url: ?xsd=1

Так же можно использовать задачу в ant с названием wsgen При этом задача будет начинаться примерно так:

 - позволяет сгенерировать на основе класса

Язык wsdl описывает типы данных типы сообщений операции сам веб-сервис (по какому uri будет размещаться)

так же в wsdl производится связывание (связываются протоколы с операциями, которые будет выполнять веб-сервис и форматы данных, используемых в сообщениях). Корневой элемент wsdl-файла - содержащий в качестве подэлементов описания    - операция - связывание - сервис

обычно описываются в xsd схеме, которая генерируется автоматически.  

 ... - описываются операции в можно описать для сообщения при ошибки   Имея описание сервиса на wsdl, можно на основе этого описания сгенерировать классы для использования клиентом с этим веб-сервисом. Для этого используется утилита wsimport. В среде разработки все это можно сделать из контекстного меню.

Объект, который будет использоваться для обращения к веб-сервису на стороне клиента должен быть помечен аннотацией javax.xml.ws.WebServiceRef, в качестве переметра которой указывается адрес wsdl-файла

ДЗ. создать сервис, возвращающий hello.