Главная страница
Навигация по странице:

  • Отправка SOAP-послания и получение ответа

  • Листинг Клиент Web-службы, созданный средствами SAAJ

  • Создание SOAP-послания с дополнениями

  • Класс AttachmentPart

  • Листинг 6.2. Послание с дополнениями

  • Разработка Web-служб средствами Java

  • Интерфейс SOAPFault

  • Листинг 6.3. Пример создания и разбора сообщения об ошибке

  • Протокол WS-Routing и его реализация

  • Разработка веб-служб средствами Java. Ильдар ХабибуллинРазработкаWebслужбсредствами


    Скачать 9.24 Mb.
    НазваниеИльдар ХабибуллинРазработкаWebслужбсредствами
    АнкорРазработка веб-служб средствами Java.pdf
    Дата03.02.2018
    Размер9.24 Mb.
    Формат файлаpdf
    Имя файлаРазработка веб-служб средствами Java.pdf
    ТипКнига
    #15148
    КатегорияИнформатика. Вычислительная техника
    страница13 из 21
    1   ...   9   10   11   12   13   14   15   16   ...   21
    :
    SOAPHeader header =
    ;
    В результате появляется элемент
    Он пуст, но уже вложен в элемент
    Аналогично формируем элемент :
    SOAPBody body =

    Глава 6. Детали создания Web Services 253
    Получаем пустой элемент вложенный в элемент
    Если заголовок
    нам не нужен, то его можно удалить:
    После этого можно заполнять SOAP-послание нужной информацией.
    Например, мы хотим обратиться к методу public String request)
    следующим образом:
    String response
    Для этого сначала создаем элемент getEcho методом
    Name element =
    "http://some.com/names");
    и помещаем элемент в элемент :
    SOAPBodyElement ge =
    Затем создаем элемент и вкладываем его в элемент . Это выполняется в следующих трех строчках:
    Name name =
    SOAPElement req =
    ") ;
    Все, SOAP-послание готово и выглядит так:
    !

    254 Разработка Web-служб средствами Java

    Отправка SOAP-послания и получение ответа
    Теперь надо отправить SOAP-послание
    Для этого надо установить со- единение с SOAP-сервером. Сначала подготавливаем объект класса
    SOAPConnectionFactory scf =
    SOAPConnection con =
    Потом определяем адрес Web-службы в виде объекта класса URL ИЛИ объекта класса Endpoint, например:
    URL endpoint =
    new
    Все готово. Теперь одним махом отправляем SOAP-послание и получаем ответ:
    response =
    endpoint);
    После получения ответа можно закрыть соединение:
    или посылать следующее сообщение.
    Как видно из приведенного выше описания, для работы метода о не- обходимо, чтобы SOAP-сервер находился на связи, иначе клиентская про- грамма зависнет в ожидании ответа. Как говорят, пакет обеспечивает
    синхронную работу клиента с Web-службой. Такой способ сетевого взаимо- действия часто называют "point-to-point", сокращенно "Р2Р".
    После получения от SOAP-сервера ответа response, надо его разобрать и выделить полезную информацию. Для этого последовательно выделяем от- дельные части ответного SOAP-послания. Сначала выделяем начальную часть послания:
    SOAPPart sp =
    Затем из начальной части выделяем SOAP-послание:
    SOAPEnvelope respEnv =

    Глава 6. Детали создания Web Services 255
    Потом вьщеляем содержимое послания:
    SOAPBody respBody =
    Из элемента , представленного объектом respBody, выбираем все вложенные элементы. Сначала получаем их итератор:
    I t e r a t o r i t =
    Нас интересует только первый элемент, содержащий ответ сервера. Полу- чим его:
    =
    Вьщеляем содержимое ответа:
    String echo =
    и выводим в стандартный вывод клиентской машины:
    сервера: " + echo);
    Все сделано, мы воспользовались услугами Web-службы. В листинге 6.1
    приведен полный текст синхронного клиента Web-службы.
    Листинг
    Клиент Web-службы, созданный средствами SAAJ
    import import j import public class ClientSAAJ{
    public static void args){
    try{
    =
    ;
    =
    SOAPPart soapPart =
    SOAPEnvelope env =
    SOAPHeader header =
    SOAPBody body =
    Name element =

    256 Разработка Web-служб средствами Java
    "getEcho", "m", "http://some.com/names");
    ge =
    Name name =
    req =
    SOAPConnectionFactory scf
    SOAPConnection con =
    URL endpoint =
    new response =
    endpoint);
    ();
    SOAPPart sp =
    SOAPEnvelope respEnv =
    SOAPBody respBody =
    Iterator it
    SOAPBodyElement bodyElement =
    String echo =
    сервера: " + echo);
    e){
    ;

    Глава 6. Детали создания Web Services 257
    Создание SOAP-послания с дополнениями
    Как сказано выше, объект класса содержит SOAP-послание с дополнениями. Пока мы использовали только начальную часть послания —
    объект класса soAPPart. В этом разделе добавим к посланию дополнитель- ные части.
    Каждое дополнение формируется методами абстрактного класса
    AttachmentPart. Создать экземпляр этого класса можно одним из трех ме- тодов класса SOAPMessage.
    Первый метод
    AttachmentPart ар =
    создает пустую дополнительную часть ар. После создания, экземпляр ар надо заполнить содержимым, применяя методы класса AttachmentPart.
    После полного оформления дополнения ар, о чем речь пойдет чуть ниже,
    его надо добавить к посланию следующим методом:
    Второй метод создания экземпляра класса AttachmentPart:
    public AttachmentPart
    Object content, String contentType);
    формирует дополнительную часть с уже готовым, предварительно опреде- ленным, содержимым content,
    которого, записываемый в поле заголовка создаваемой дополнительной части, равен contentType. Например:
    AttachmentPart ар =
    "Это простой плоский ASCII-текст дополнения",
    "text/plain;
    Третий метод создания дополнительной части public AttachmentPart handler);
    использует дескриптор handler данных, полученных из файла или с какого- то адреса URL с помощью механизма Java Activation Framework [10]. На- пример:
    URL
    = new
    AttachmentPart
    9 748

    258 Разработка Web-служб средствами Java
    Итак, если содержимое дополнительной части уже готово и не нужны до- полнительные заголовки, то дополнение создается одним действием. По- смотрим, какими методами обладает класс для того чтобы создать нестандартное дополнение к SOAP-посланию.
    Класс AttachmentPart
    Напомним, что каждая дополнительная часть послания, оформленного по спецификации "SOAP с дополнениями" (см. главу 3), записывается после
    Дополнительная часть состоит из необязательного состоящего из нескольких полей, пустой строки и произ- вольного содержимого. Среди полей заголовка наиболее важно поле content-Type, определяющее содержимого.
    Создание дополнения
    Несколько методов класса AttachmentPart формируют дополнительной части SOAP-послания.
    Поле name MIME-заголовка со значением value добавляется к заголовку дополнительной части методом public void name, String value);
    Ввиду особой важности поля Content-Type, для его создания есть специ- альный метод public void value);
    Еще два поля —
    и
    — добавляются к заголов- ку собственными методами public void value);
    public void value);
    Если поля заголовка уже определены, то эти три метода меняют их значения. Заменить старое значение любого поля name заголовка новым значением value можно методом public void name, String value);
    Этот же метод определяет новое поле заголовка, если оно еще не было создано.
    Содержимое content дополнения включается в методом public void
    String contentType);

    Глава 6. Детали создания Web Services 259
    Кроме ТОГО, ЭТОТ метод записывает
    ПОЛЯ Content-
    Type.
    Разбор дополнения
    Следующие методы облегчают SOAP-серверу разбор полученного от клиен- та послания.
    Выделить все дополнительные части из полученного послания класса
    МОЖНО
    public Iterator класса SOAPMessage, возвращающим итератор, с помощью которого можно перебрать все дополнительные части послания.
    Еще один метод же класса public Iterator headers);
    возвращает итератор всех дополнительных частей с полями заголовков, за- несенными В объект headers.
    Получив итератор одним из этих двух методов, обычным образом выбираем дополнение:
    I t e r a t o r i t =
    while
    {
    // Обработка дополнительной части послания
    }
    Выбрав нужное дополнение, разбираем его и выделяем полезную информа- цию. Для этого в классе AttachmentPart есть несколько методов доступа getxxx (). Перечислим их.
    Содержимое дополнительной части можно получить методом public Object
    Размер содержимого в байтах возвращает метод public int
    Перебрать значения всех полей заголовка можно, получив их итератор ме- тодом public Iterator
    () ;
    Значения всех полей с именем name в виде массива строк возвращает метод public name);

    260 Разработка Web-служб средствами Java
    Метод public Iterator names);
    возвращает итератор всех полей заголовка, чьи имена занесены в массив names.
    Метод public Iterator names);
    решает двойственную задачу — возвращает итератор всех полей заголовка,
    чьи имена не совпадают с именами, перечисленными в массиве names.
    Наконец, значения трех полей заголовка: content-Type,
    и
    Content-Location можно получить специальными методами public String public String public String
    Удаление частей дополнения
    Удалить содержимое дополнения можно методом public void
    Все поля заголовка дополнения удаляет метод public void
    () ;
    Следующий метод public void name);
    удаляет все поля заголовка с именем name.
    В листинге 6.2 приведен пример формирования и отправки SOAP-послания с дополнением — страничкой HTML.
    Листинг 6.2. Послание с дополнениями
    import import import import java.util.*;
    import public class ClientSAAJAttach{
    public static void args)(

    Глава 6. Детали создания Web Services 261
    try{
    =
    =
    SOAPPart soapPart =
    SOAPEnvelope env =
    SOAPHeader header =
    SOAPBody body =
    Name element =
    "getEcho",
    "http://some.com/names");
    SOAPBodyElement ge
    Name name
    SOAPElement req =
    URL
    = new
    AttachmentPart
    =
    ;
    SOAPConnectionFactory scf =
    ;
    SOAPConnection con =
    URLEndpoint endpoint =
    new

    Разработка Web-служб средствами Java
    response =
    endpoint);
    ();
    SOAPPart sp
    SOAPEnvelope respEnv =
    SOAPBody respBody =
    Iterator it =
    =
    String echo =
    сервера: " + echo);
    e){
    Сообщение об ошибке
    Как уже говорилось в главе 3, заметив ошибку в полученном послании,
    SOAP-сервер отправляет сообщение, содержащее в теле ответного SOAP- послания всего один элемент вложенный в элемент . В па- кете SAAJ есть интерфейс soAPFauit, описывающий элемент .
    Интерфейс SOAPFault
    Напомним, что в элемент версии SOAP 1.1 можно вложить элемен- ты , , И . Они создаются дующими методами, описанными в интерфейсе soAPFauit:
    public void faultCode);
    public void faultString);
    public void faultActor);
    public Detail
    ;

    Глава 6. Детали создания Web Services 263
    Остальные методы интерфейса soAPFauit предназначены для разбора кли- ентом полученного от сервера сообщения об ошибке:
    public String public String public String public Detail getDetail();
    Как видно из этого описания, метод создает пустой элемент
    . Его надо наполнить содержимым. Это выполняется методом public DetailEntry name);
    описанным в интерфейсе Detail.
    Посмотреть при разборе содержимое элемента можно при помощи итератора, полученного вторым методом интерфейса Detail:
    public Iterator
    Все эти действия приведены в листинге 6.3.
    * Листинг 6.3. Пример создания и разбора сообщения об ошибке
    import j import java.util.*;
    public class public static void main(String[] args)(
    try{
    MessageFactory
    =
    =
    SOAPEnvelope env =
    SOAPBody body =
    SOAPFault fault =

    264 Разработка Web-служб средствами Java
    "Послание неправильно оформлено");
    Detail detail =
    Name entryNamel =
    "comment",
    "http://some.com/comments");
    DetailEntry entry =
    задано значение параметра");
    Name entryName2 =
    "confirmation", "ns2", "http://some.com/confirm");
    DetailEntry entry2 =
    код отправителя");
    // Проверим созданное послание.
    if fault =
    String code =
    String s =
    String actor =
    ошибки: " + code);
    " + s ) ;
    if (actor != null)
    замечена " + actor);
    detail =
    if (detail != null){

    Глава 6. Детали создания Web Services 265
    " ) ;
    Iterator it =
    while entry =
    String value =
    e){
    обмен сообщениями
    Пакет SAAJ обеспечивает создание SOAP-посланий и обмен ими в син- хронном режиме Р2Р (point-to-point). Часто такой способ обмена сообще- ниями оказывается невозможным из-за того, что участники обмена не все- гда одновременно находятся на связи. В таких случаях приходится обмени- ваться сообщениями асинхронно, не дожидаясь ответа на посланное сообщение. Так работает электронная почта. В технологии Java асинхрон- ный обмен SOAP-посланиями обеспечивается интерфейсами и классами пакета JAXM, находящимися в Java-пакете
    Реализация асинхронного обмена посланиями основана на том, что по- слание принимает не адресат, которому оно направлено, а так называемый поставщик сообщений. Поставщик сообщений (messaging provider) — это программа, которая должна постоянно находиться на связи, принимать послания, временно хранить их и передавать адресату, как только тот вый- дет на связь. Поставщик сообщений реализуется как распределенное при- ложение, отдельные компоненты которого находятся и у отправителя со- общений и у их получателя. В технологии Java система обмена сообще- ниями реализована механизмом JMS (Java Message Service). С механизмом
    JMS можно ознакомиться, например, по книге [10], но это необязательно.
    Присутствие поставщика сообщений совершенно не ощущается SOAP- клиентом и SOAP-сервером, пакет JAXM берет на себя всю работу с по- ставщиком.

    Разработка Web-служб средствами Java
    Поставщик сообщений может посылать отправителю подтверждение
    (acknowledgement) в получении послания или не посылать его. В любом случае отправитель не дожидается ответа, а переключается на решение дру- гих задач. Ответ может прийти позднее, даже через несколько дней, или во- обще не прийти.
    Некоторые системы обмена сообщениями задают специфичные элементы
    SOAP-посланий. Например, спецификация "ebXML Message Service
    Specification" определяет обязательные для ebXML-послания блоки заголов- ка , ,
    и другие. Совокупность таких элементов образует профиль (profile) SOAP-послания. Профили посланий различаются своими именами. Имя профиля может быть простой строкой,
    например,
    "soaprp", или строкой URI. У каждого поставщика со- общений есть некоторый набор известных ему профилей. Стандартная реализация JAXM "понимает" профиль ebXML и профиль протокола
    Microsoft WS-Routing, называемый в документации
    Послания с этими профилями создаются методами специально разработанных клас- сов
    И
    ИЗ пакетов
    И com.
    Создавая SOAP-послание средствами JAXM, нужно указывать его профиль.
    Поэтому мы сначала рассмотрим подробнее протокол WS-Routing, описы- вающий профиль
    Протокол WS-Routing и его реализация
    Протокол WS-Routing (Web Services Routing Protocol), разработанный корпорацией Microsoft в 2001 году предназначен для создания и отправки
    SOAP-посланий, не требующих ответа и подтверждения получения. Посла- ние, отправленное по протоколу WS-Routing, может на своем пути пройти несколько промежуточных серверов (actors), которые могут сделать предва- рительную обработку послания (forward message path). Это делает и обычное
    SOAP-послание, но протокол WS-Routing, в отличие от протокола SOAP,
    определяет точный порядок прохождения промежуточных серверов. Это по- зволяет спланировать последовательность обработки послания промежуточ- ными серверами. Хотя протокол не предназначен для двусторонней связи,
    он позволяет отследить обратный путь (reverse message path) для посылки ответного послания.
    Послание, созданное по правилам протокола WS-Routing, можно отправить не только по протоколам HTTP или SMTP, но и прямо по протоколу TCP
    или UDP, причем промежуточные серверы могут по своему усмотрению менять транспортный протокол.

    Глава 6. Детали создания Web Services 267
    Итак, главная цель протокола WS-Routing — обеспечить точный маршрут прохождения SOAP-послания от отправителя до получателя. Дополнительно можно задать обратный маршрут. Для достижения этих целей в заголовок
    SOAP-послания
    1   ...   9   10   11   12   13   14   15   16   ...   21


    написать администратору сайта