В части 1 этой серии я представил кросс-браузер JavaScript библиотеку (cross-browser JavaScript library), обеспечивающую простые SOAP клиентские Web сервисы, поддерживающие требования стилей: RPC кодированные и документально-буквенные. В приложение клиента включаются обработчики запросов и откликов, обычная XML схема параллельно-последовательного/последовательно-параллельного преобразования, и SOAP заголовки; каждый из которых используется при выполнении WS-Addressing и WS-ResourceFramework.
исходные объекты определены в
ws.js
(представлены в части 1) включают:
- WS.Call: Клиентский Web сервис, который заключает в оболочку XMLHttpRequest
- WS.QName: Введение составного имени (XML Qualified Name implementation)
- WS.Binder: обычная XML схема параллельно-последовательного/последовательно-параллельного преобразования
- WS.Handler: База для обработчиков запрос/ответ
- SOAP.Element: Базовый элемент SOAP Element, который заключает в оболочку XML DOM
- SOAP.Envelope: Объект оболочки (SOAP Envelope Object) расширяет SOAP.Element
- SOAP.Header: Объект заголовка (SOAP Header Object) расширяет SOAP.Element
- SOAP.Body: Объект основы (SOAP Body Object) расширяет SOAP.Element
- XML: Межплатформенные обслуживающие методы для обработки XML
Среди этих объектов пять являются критическими для выполнения WS-Addressing и WS-ResourceFramework:
WS.QName
,
SOAP.Element
,
WS.Handler
,
WS.Binder
, and
WS.Call
. Я предполагаю, что вы обратитесь к
первой статье,
чтобы просмотреть основные функции этих объектов.
В этом фрагменте я представляю два новых файла JavaScript. Первый определяет объект, поддерживающий WS-Addressing (
wsa.js
); второй определяет объект, поддерживающий выполнение WS-ResourceFramework (
wsrf.js
).
Рисунок 1. Запуск сервиса Web Service Resource Framework из Web браузера, используя Web Services JavaScript Library
Исходные объекты определены
wsa.js
включают:
- WSA.EndpointReference: Объект окончания связи (WS-Addressing EndpointReference object).
- WSA.EndpointReference.ReferenceParameters: Контейнер для параметров ссылки WS-Addressing EPR.
- WSA.EndpointReference.Binder: XML схема параллельно-последовательного/последовательно-параллельного преобразования объектов WSA.EndpointReference.
- WSA.MessageContext: Контейнер для метаданных названий сообщений WS-Addressing SOAP.
- WSA.Handler: Обработчик запросов, который вставляет названия сообщений WS-Addressing SOAP в оболочку SOAP Envelope.
Исходные объекты определены
wsrf.js
включают:
- WSRF.Request.GetResourceProperty : Упаковщик для WS-ResourceFramework операции получения свойств ресурсов (GetResourceProperty operation).
- WSRF.Request.GetMultipleResourceProperties : Упаковщик для WS-ResourceFramework операции получения многочисленных свойств ресурсов (GetMultipleresourceProperties operation).
- WSRF.Resource : Клиентский интерфейс для запуска операций WS-ResourceFramework.
Заметьте, что при этом вы можете изучить большое количество новых объектов JavaScript, представленное API было создано, чтобы уменьшить количество работы пользователя при запуске Web сервиса. Например, в листинге 8, вы увидите, что API позволяет запустить метод на соответствующем WS-ResourceFramework Web сервисе только с несколькими строками программы - без необходимости поиска базового выполнения SOAР.
Запустите поддержку WS-Addressing
Спецификация адресации Web сервисов (Web Services Addressing specification) определяет механизмы для ввода адресованной информации в оболочку SOAP. В основе WS-Addressing лежит объект
EndpointReference
, который служит ссылкой и описанием конкретного примера Web сервиса. (См.
листинг 1.) Вслед за EndpointReference, спецификация WS-Addressing определяет количество SOAP названий сообщений, которые используются, чтобы перенаправить адресованную информацию прямо в оболочку SOAP.
wsa.js
Библиотека JavaScript обеспечивает необходимое количество объектов, которые осуществляют базовую поддержку для элементов WS-Addressing EndpointReference и SOAP названий сообщений.
Листинг 1. Обычный WS-Addressing EndpointReference
xmlns="http://www.w3.org/2005/08/addressing">
<Address>http://www.example.org/services/HelloWorld</Address>
<ReferenceParameters>
<abc:foo xmlns:abc="urn:foo">This is a test</abc:foo>
</ReferenceParameters>
</EndpointReference>
|
Объект WSA.EndpointReference object используется для представления WS-Addressing EndpointReferences, как показывает листинг 2. Сравните эту программу с XML, и вы поймете, как работает интерфейс прикладного программирования API.
Листинг 2. Создайте EndpointReference с помощью WSA.js
new WSA.EndpointReference(
"http://www.example.org/services/HelloWorld");
var epr_rp = epr.create_reference_parameters();
epr_rp.create_child(
new WS.QName('foo','urn:foo','abc')).
set_value('This is a test');
|
API для WSA.EndpointReference поддерживает свойства адреса и параметров ссылки определенные информационной моделью WS-Addressing. Свойства метаданных не выполняются, так как они здесь не являются критичными для клиента.
WS-Addressing SOAP названия сообщений предназначены для установки в оболочку (SOAP Envelope), отправленную клиентским Web сервисом на сервис. Потому что объект WS.Call определен в
ws.js
JavaScript библиотека скрывает детали работы с базовой SOAP.Envelope, вы используете WS.Handler, чтобы ввести подходящие вам названия.
Клиентский Web сервис запускает методы объекта WS.Handler на каждый запрос, ответ или ошибку. Для выполнения WS-Addressing предоставляется WSA.Handler, который использует объект-корреспондент WSA.MessageContext, в котором содержится информация для введения в сообщение. Этот метод показан в листинге 3.
'http://www.example.com/services/HelloWorld';
var ctx = new WSA.MessageContext();
ctx.to = new WSA.EndpointReference(address);
ctx.replyto = new WSA.EndpointReference(WSA.ANONYMOUS);
ctx.action = address + '#SayHello'
var handler = new WSA.Handler();
handler.set_context(ctx);
var call = new WS.Call('');
call.add_handler(handler);
|
Свойства объекта WSA.MessageContext соответствует каждому из названий сообщений WS-Addressing SOAP:
- to: Объект WSA.EndpointReference, адрес которого специфицирует универсальный идентификатор ресурса (URI), определяющий назначение сообщения.
- from: Объект WSA.EndpointReference идентифицирует отправителя сообщения.
- replyto: Объект WSA.EndpointReference идентифицирует, куда должен быть доставлен ответ.
- faultto: Объект WSA.EndpointReference идентифицирует, куда должна быть доставлена ошибка.
- action: Универсальный идентификатор ресурса (URI) идентифицирует, что сообщение направлено к триггеру.
- messageid: Универсальный идентификатор ресурса (URI) идентифицирует сообщение однозначно.
- relatesto: Массив пар URI идентифицирует связанные сообщения. Первый URI в паре идентифицирует тип связи; второй URI специфицирует однозначное имя сообщения (unique Message ID) связанного сообщения.
Когда WSA.Handler будет зарегистрирован с помощью объекта WS.Call, который используется для запуска Web сервиса, объект WS.Call запускает обработчик на каждый запрос, отправляя ссылку на объект SOAP.Envelope. Обработчик берет информацию из WSA.MessageContext и вставляет соответствующие названия в сообщения, как показывает листинг 5.
Выполнение поддержки WS-ResourceFramework
Web Services Resource Framework определяет соглашение для использования стандартов Web сервиса, чтобы иметь доступ и возможность использования кумулятивных ресурсов. Индивидуальные ресурсы идентифицируются и отсылаются WS-Addressing EndpointReferences. Множество общих операций могут использоваться для извлечения и модификации свойств ресурсов.
wsrf.js
JavaScript библиотека обеспечивает частичное выполнение Web Services Resource Framework, поддерживающее операции GetResourceProperty и GetMultipleResourceProperties. API основан на
ws.js
и
wsa.js
APIs и создан скорее с целью иллюстрации использования обоих сценариев, чем для комплексного выполнения WS-ResourceFramework.
Операции WS-ResourceFramework являются документально-буквенными запросами SOAP, которые направлены на специальные виды ресурсов. Целевой ресурс идентифицируется WS-Addressing EndpointReference, как показано на листинге 4.
Листинг 4. A WSRF EndpointReference
<EndpointReference xmlns="http://www.w3.org/2005/08/addressing">
<Address>http://localhost:9080/SoapAjax2/services/DeviceService</Address>
<ReferenceParameters>
<abc:DeviceID xmlns:abc="urn:deviceservice">ABC123</abc:DeviceID>
</ReferenceParameters>
</EndpointReference>
|
При изображении в оболочке (SOAP Envelope) с использованием механизмов, определенных в
wsa.js
, информация в WSRF EndpointReference приобретает форму названия сообщения SOAP, как показывает
листинг 5.
Листинг 5. Запрос WSRF GetResourceProperty Request
xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Header>
<To xmlns="http://www.w3.org/2005/08/addressing">
http://localhost:9080/SoapAjax2/services/DeviceService</To>
<abc:DeviceID xmlns="urn:deviceservice">ABC123</abc:DeviceID>
</Header>
<Body>
<GetResourceProperty
xmlns="http://docs.oasis-open.org/wsrf/rp-2"
xmlns:ns="urn:foo">ns:bar</GetResourceProperty>
</Body>
</Envelope>
|
API представлен
wsrf.js
создан, чтобы скрывать все детали работы с SOAP Envelope и заглавиями WS-Addressing, необходимые для активизации взаимодействия с Web сервисами WS-ResourceFramework. Осуществив считывание элемента данных программы, вы увидите все важные аспекты того, как работает программа.
Листинг 6
показывает объект упаковщика для операции WSRF GetResourceProperty. Этот упаковщик используется внутри
wsrf.js
библиотеки и включает базовый механизм для создания SOAP Envelope и построения необходимого XML для операции. Обратите внимание, что объект использует SOAP.Element и SOAP.Envelope APIs, предоставленные
ws.js
. Параметр "qname", отправленный в инициализацию объекта упаковщика - это составное имя (XML Qualified name) свойства, которое запрашивается.
Листинг 6. Упаковщик запроса WSRF GetResourceProperty
WSRF.Request.GetResourceProperty.prototype = {
initialize : function(qname) {
this.envelope = new SOAP.Envelope();
this.set_qname(qname);
},
set_qname : function(qname) {
var body = this.envelope.create_body();
var method = body.create_child(
WSRF.Request.QNAME_GETRESOURCEPROPERTY);
if (!qname.namespace) qname.namespace = '';
if (!qname.prefix) qname.prefix = 'ns';
method.declare_namespace(qname);
method.set_value(qname.value_of());
}
};
|
Листинг 7
содержит часть программы из
WSRF.Resource
объекта. Вы увидите создание объекта WS.Call и подготовку объекта WSA.Handler, который будет использоваться, чтобы задать соответствующие названия сообщений SOAP, создание объекта упаковщика WSRF.Request.GetResourceProperty и запуск операций Web сервиса.
Листинг 7. Запуск WSRF GetResourceProperty
var call = new WS.Call(this.address);
var handler = new WSA.Handler();
var wsactx = new WSA.MessageContext(this.epr);
handler.set_context(wsactx);
call.add_handler(handler);
var req = new WSRF.Request.GetResourceProperty(qname);
call.invoke(req.envelope, callback);
}
|
Чтобы запустить операцию GetResourceProperty наряду с WS-ResourceFramework Web сервисом, приложению нужно только поддержать EndpointReference для целевых объектов WS-Resource и WS.QName, которые идентифицируют извлеченные свойства, как показывает листинг 8.
Листинг 8. Соберите их все вместе
function getDeviceName(deviceID, container) {
var epr = new WSA.EndpointReference(ADDRESS);
var epr_rp = epr.create_reference_parameters();
epr_rp.create_child(
new WS.QName(
'DeviceID',
'urn:deviceservice')).set_value(deviceID);
var res = new WSRF.Resource(ADDRESS, epr);
res.get_resource_property(
new WS.QName('DeviceName','urn:deviceservice'),
function(call,envelope) {
$('soap').innerHTML = arguments[2].escapeHTML();
}
);
}
|
Листинг 8 преобразовывает вызов WS-Resource в удобную функцию, которая может быть легко вызвана на вашей HTML странице. Листинг 9 предоставляет кнопку, которая обращается к имени устройства из введенного поля, названного имя и отображает ответ SOAP Envelope в дивергеционном элементе с названием результат.
Листинг 9. Запуск операции Получить имя устройства (getDeviceName)
value="Invoke the Web Service"
type="button"
onclick="getDeviceName($('id').value,$('result'))" />
|
В этом фрагменте вы увидели, как клиентские Web сервисы Ajax, представленные в части 1 этой серии, могут быть расширены для поддержки высокого уровня стандартов Web сервисов, таких как Web Services Addressing и Web Services Resource Framework. В следующем фрагменте, автор исследует поддержку для Web Services Description Language.
| Описание | Имя | Размер | Метод загрузки |
|---|---|---|---|
| Пример проекта | ws-wsajax2code.zip | 14KB | HTTP |
Научиться
- Оригинал статьи
Call SOAP Web services with Ajax, Part 2: Extend the Web services client
.
-
Вызов SOAP Web сервисов с помощью Ajax
- Прочтите все части этой серии.
-
Постройте динамические Java приложения
- Введение в Ajax Филипа Маккарти (Philip McCarthy)для Java разработчиков (developerWorks, September 2005).
-
JavaScript Framework
- Изучите прототипы шаблонов, на которых основывается библиотеки Web Services JavaScript Library.
-
XMLHttpRequest API
- Узнайте больше с Web сайта XUL Planet
-
Воспользуйтесь моделью объекта документа (Document Object Model), чтобы создать усовершенствованное Web приложение
- Узнайте больше о XML Document Object Model, которое использует Microsoft Internet Explorer 6.0 (developerWorks, February 2004).
-
Mozilla Web Services
- Узнайте больше о поддержке Mozilla/Firefox's встроенных Web сервисов.
-
Web Services Resource Framework
- Узнайте больше о процессе OASIS Web Services Resource Framework.
-
Web Services Addressing
- Узнайте больше о процессе W3C Web Services Addressing.
-
Standards roadmap
- Уясните вклад и важность стандартов и спецификаций для развития SOA и Web сервисов.
-
Архитектура: Построение на будущее
- Посетите площадь архитектуры в работах разработчиков и получите необходимые ресурсы, чтобы улучшить свои навыки в архитектурной среде.
-
SOA и Web сервисы
содержат сотни информационных и ознакомительных статей, средних и сложных учебников по развитию приложений Web сервисов.
Обсудить
- Примите участие в обсуждении материала на форуме.
-
Блоги разработчиков
- Подключитесь к обществу разработчиков.
Джеймс Снелл (James Snell) является членом исследовательской лаборатории IBM WebAhead, занимающейся разработкой опытных образцов стандартов и технологий программного обеспечения, находящегося в стадии создания, для собственных нужд IBM. Его научно-исследовательские интересы охватывают широкий круг направлений современных технологий, а именно Atom, AJAX, REST, Open Source, персональные издательские системы, семантические и ситуационные Web-приложения. Он является активным участником проекта Apache Abdera, находящегося в настоящее время на этапе разработки и нацеленного на создание высокоэффективной и функционально законченной реализации стандартов формата синдикации Atom и протокола публикации Atom.