Разработка веб-служб средствами Java. Ильдар ХабибуллинРазработкаWebслужбсредствами
Скачать 9.24 Mb.
|
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 можно вложить элемен- ты 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(); Как видно из этого описания, метод создает пустой элемент описанным в интерфейсе 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, причем промежуточные серверы могут по своему усмотрению менять транспортный протокол. |