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

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

Введите основанные на браузере SOAP (Web Browser-based SOAP) клиентские Web сервисы, используя шаблон проекта асинхронного JavaScript (Asynchronous JavaScript) и XML (Ajax). В части 1 этой серии, "Call SOAP Web Services with Ajax, Part 1," автор представил простую, основанную на Web браузере библиотеку (Web browser-based JavaScript library) для запуска SOAP Web services. В последующем тексте автор расширяет функции этой библиотеки путем ввода базовой поддержки для спецификации Web Services Addressing Language и Web Services Resource Framework.

Джеймс Снелл, разработчик программного обеспечения, IBM

Джеймс Снелл (James Snell) является членом исследовательской лаборатории IBM WebAhead, занимающейся разработкой опытных образцов стандартов и технологий программного обеспечения, находящегося в стадии создания, для собственных нужд IBM. Его научно-исследовательские интересы охватывают широкий круг направлений современных технологий, а именно Atom, AJAX, REST, Open Source, персональные издательские системы, семантические и ситуационные Web-приложения. Он является активным участником проекта Apache Abdera, находящегося в настоящее время на этапе разработки и нацеленного на создание высокоэффективной и функционально законченной реализации стандартов формата синдикации Atom и протокола публикации Atom.



09.06.2007

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

В части 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.


Загрузка

ОписаниеИмяРазмер
Пример проектаws-wsajax2code.zip14KB

Ресурсы

Научиться

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


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