Содержание


Вызов SOAP Web сервисов с помощью Ajax, Часть 2

Увеличьте клиентские Web сервисы

Средство поддержки для Web Services Addressing Language и Web Services Resource Framework

Comments

Серия контента:

Этот контент является частью # из серии # статей: Вызов SOAP Web сервисов с помощью Ajax, Часть 2

Следите за выходом новых статей этой серии.

Этот контент является частью серии:Вызов SOAP Web сервисов с помощью Ajax, Часть 2

Следите за выходом новых статей этой серии.

Краткий обзор

В части 1 этой серии я представил кросс-браузер JavaScript библиотеку (cross-browser JavaScript library), обеспечивающую простые SOAP клиентские Web сервисы, поддерживающие требования стилей: RPC кодированные и документально-буквенные. В приложение клиента включаются обработчики запросов и откликов, обычная XML схема параллельно-последовательного/последовательно-параллельного преобразования, и SOAP заголовки; каждый из которых используется при выполнении WS-Addressing и WS-ResourceFramework.

исходные объекты определены в ws.js (представлены в части 1) включают:

  1. WS.Call: Клиентский Web сервис, который заключает в оболочку XMLHttpRequest
  2. WS.QName: Введение составного имени (XML Qualified Name implementation)
  3. WS.Binder: обычная XML схема параллельно-последовательного/последовательно-параллельного преобразования
  4. WS.Handler: База для обработчиков запрос/ответ
  5. SOAP.Element: Базовый элемент SOAP Element, который заключает в оболочку XML DOM
  6. SOAP.Envelope: Объект оболочки (SOAP Envelope Object) расширяет SOAP.Element
  7. SOAP.Header: Объект заголовка (SOAP Header Object) расширяет SOAP.Element
  8. SOAP.Body: Объект основы (SOAP Body Object) расширяет SOAP.Element
  9. 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
Запуск сервиса Web Service Resource Framework из Web браузера

Исходные объекты определены wsa.js включают:

  1. WSA.EndpointReference: Объект окончания связи (WS-Addressing EndpointReference object).
  2. WSA.EndpointReference.ReferenceParameters: Контейнер для параметров ссылки WS-Addressing EPR.
  3. WSA.EndpointReference.Binder: XML схема параллельно-последовательного/последовательно-параллельного преобразования объектов WSA.EndpointReference.
  4. WSA.MessageContext: Контейнер для метаданных названий сообщений WS-Addressing SOAP.
  5. WSA.Handler: Обработчик запросов, который вставляет названия сообщений WS-Addressing SOAP в оболочку SOAP Envelope.

Исходные объекты определены wsrf.js включают:

  1. WSRF.Request.GetResourceProperty : Упаковщик для WS-ResourceFramework операции получения свойств ресурсов (GetResourceProperty operation).
  2. WSRF.Request.GetMultipleResourceProperties : Упаковщик для WS-ResourceFramework операции получения многочисленных свойств ресурсов (GetMultipleresourceProperties operation).
  3. 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.


Ресурсы для скачивания


Похожие темы


Комментарии

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

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=SOA и web-сервисы, Технология Java, XML
ArticleID=230339
ArticleTitle=Вызов SOAP Web сервисов с помощью Ajax, Часть 2: Увеличьте клиентские Web сервисы
publish-date=06092007