楼主: lastwinner

[转载] 使用 AJAX 调用 SOAP Web 服务

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
31#
 楼主| 发表于 2006-7-9 20:57 | 只看该作者
wsa.js 中定义的主要对象包括:
  • WSA.EndpointReference:WS-Addressing EndpointReference 对象。
  • WSA.EndpointReference.ReferenceParameters:WS-Addressing EPR 引用参数的容器。
  • WSA.EndpointReference.Binder:WSA.EndpointReference 对象的 XML 序列化器/反序列化器。
  • WSA.MessageContext:WS-Addressing SOAP 消息 Header 元数据的容器。
  • WSA.Handler:将 WS-Addressing SOAP 消息 Header 插入 SOAP 信封的请求处理程序。

wsrf.js 中定义的主要对象包括:
  • WSRF.Request.GetResourceProperty:WS-ResourceFramework GetResourceProperty 操作的包装对象。
  • WSRF.Request.GetMultipleResourceProperties:WS-ResourceFrame GetMultipleresourceProperties 操作的包装对象。
  • WSRF.Resource:用于调用 WS-ResourceFramework 操作的客户机接口。

请注意,虽然这可能意味着要了解大量的新 JavaScript 对象,但它们所提供的 API 都经过了专门设计,以尽可能减少在实际调用 Web 服务时必须进行的工作量。例如,如果您跳到清单 8,您将发现,通过使用 API,您只需使用寥寥数行代码即可调用与 WS-ResourceFramework 兼容的 Web 服务中的方法--而无需受底层 SOAP 实现细节的困扰。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
32#
 楼主| 发表于 2006-7-9 20:58 | 只看该作者
实现 WS-Addressing 支持
Web 服务寻址规范定义了用于向 SOAP 信封插入寻址信息的机制。WS-Addressing 的核心是一个称为 EndpointReference 的对象,该对象可作为对特定 Web 服务实例的引用和说明。(请参见清单 1。)除了 EndpointReference 之外,WS-Addressing 规范还定义了许多 SOAP 消息 Header,可以将其用于直接在 SOAP 信封中传递寻址信息。
wsa.js JavaScript 库提供了许多实现了对 WS-Addressing EndpointReference 和 SOAP 消息 Header 元素的基本支持的对象。
清单 1. 一个简单的 WS-Addressing EndpointReference
[php]
<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>
.......
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
33#
 楼主| 发表于 2006-7-9 20:59 | 只看该作者
WSA.EndpointReference 对象用于表示 WS-Addressing EndpointReference,如清单 2 中所示。通过将此代码与上面的 XML 进行比较,您应当能够很好地理解 API 的操作方式。
清单 2. 创建与 WSA.js 相关的 EndpointReference
[php]
var epr =
  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');
...........
[/php]
WSA.EndpointReference 的 API 目前支持 WS-Addressing 信息模型所定义的 Address 和 ReferenceParameters 属性。目前尚未实现 Metadata 属性,因为这个属性对于此处实现的客户机基本功能并不重要。
WS-Addressing SOAP 消息 Header 应该设置在 Web 服务客户机发送给服务的 SOAP 信封上。由于在 ws.js JavaScript 库中定义的 WS.Call 对象将隐藏使用底层 SOAP 信封的细节,因此请使用 WS.Handler 来为您插入恰当的 Header。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
34#
 楼主| 发表于 2006-7-9 21:00 | 只看该作者
Web 服务客户机将针对每个请求、响应和错误调用 WS.Handler 对象的各个方法。对于 WS-Addressing 实现,提供了一个 WSA.Handler,以使用相应的 WSA.MessageContext 对象(其中包含要插入到消息中的信息)。清单 3 演示了这一过程。
清单 3. 使用 WS-Addressing 上下文和处理程序
[php]
var address = '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);
.........
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
35#
 楼主| 发表于 2006-7-9 21:01 | 只看该作者
WSA.MessageContext 对象中的属性与每个 WS-Addressing SOAP 消息 Header 相对应:
  • to:一个 WSA.EndpointReference 对象,其 Address 指定表示信息目的地的绝对 URI。
  • from:一个 WSA.EndpointReference 对象,标识消息的发送方。
  • replyto:一个 WSA.EndpointReference 对象,标识回复应送达的位置。
  • faultto:一个 WSA.EndpointReference 对象,标识错误应送达的位置。
  • action:一个绝对 URI,标识消息应触发的操作。
  • messageid:唯一标识消息的绝对 URI。
  • relatesto:标识相关消息的 URI 对的数组。URI 对中的第一个 URI 标识关系类型;第二个 URI 指定相关消息的唯一 Message ID。

WSA.Handler 向用于调用 Web 服务的 WS.Call 对象进行了注册后,WS.Call 对象就会在每次请求时调用该处理程序,向其传递对 SOAP.Envelope 对象的引用。处理程序将从 WSA.MessageContext 中提取信息,并向消息中插入恰当的 Header,如清单 5 中所示。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
36#
 楼主| 发表于 2006-7-9 21:01 | 只看该作者
实现 WS-ResourceFramework 支持
Web 服务资源框架定义了一个使用 Web 服务标准访问和操作有状态资源的实例的约定。各个资源均使用 WS-Addressing EndpointReference 进行标识和引用。可以使用一些常见操作来检索或修改资源的属性。
wsrf.js JavaScript 库提供了支持 GetResourceProperty 和 GetMultipleResourceProperties 操作的部分 Web 服务资源框架实现。该 API 是以 ws.jswsa.js API 为基础构建的,主要是为了演示这两个脚本的使用而设计的,而不是为了提供全面的 WS-ResourceFramework 实现。
WS-ResourceFramework 操作是定向到特定 Resource 实例的文档-文本 SOAP 请求。目标资源是用 WS-Addressing EndpointReference 标识的,如清单 4 所示。
清单 4. WSRF EndpointReference
[php]
<EndpointReference xmlns="http://www.w3.org/2005/08/addressing">
  <Address>http://localhost:9080/SoapAjax2/services/DeviceService</Address>
  <ReferenceParameters>
    <abceviceID xmlns:abc="urn:deviceservice">ABC123</abceviceID>
  </ReferenceParameters>
</EndpointReference>
.......
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
37#
 楼主| 发表于 2006-7-9 21:02 | 只看该作者
当使用 wsa.js 中定义的机制在 SOAP 内进行表示时,WSRF EndpointReference 中的信息将以 SOAP 消息 Header 的形式出现,如清单 5 中所示。
清单 5. WSRF GetResourceProperty 请求
[php]
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
<Header>
  <To xmlns="http://www.w3.org/2005/08/addressing">
    http://localhost:9080/SoapAjax2/services/DeviceService</To>
  <abceviceID xmlns="urn:deviceservice">ABC123</abceviceID>
</Header>
<Body>
<GetResourceProperty
  xmlns="http://docs.oasis-open.org/wsrf/rp-2"
  xmlns:ns="urn:foo">ns:bar</GetResourceProperty>
</Body>
</Envelope>
.......
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
38#
 楼主| 发表于 2006-7-9 21:04 | 只看该作者
wsrf.js 提供的 API 用于隐藏使用 SOAP Envelope 的所有细节以及允许与 WS-ResourceFramework Web 服务交互所必需的 WS-Addressing Header。不过,稍微注意一下此代码,您就会发现此代码的工作方式的许多重要方面。
清单 6 演示了 WSRF GetResourceProperty 操作的包装对象。此包装对象由 wsrf.js 库内部使用,其中包含了创建 SOAP 信封和构建操作所必需的 XML 的基本机制。请注意,该对象利用了 ws.js 提供的 SOAP.Element 和 SOAP.Envelope API。在包装对象初始化阶段传入的“qname”参数是所请求的属性的 XML 限定名称。
清单 6. WSRF GetResourceProperty 请求包装对象
[php]
WSRF.Request.GetResourceProperty = Class.create();
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());
  }
};
.........
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
39#
 楼主| 发表于 2006-7-9 21:05 | 只看该作者
清单 7 中包含了来自 WSRF.Resource 对象的代码片段。您所看到的代码的作用在于:创建 WS.Call 对象,准备将用于设置恰当的 SOAP 消息 Header 的 WSA.Handler 对象,创建 WSRF.Request.GetResourceProperty 包装对象以及调用各个 Web 服务操作。
清单 7. 调用 WSRF GetResourceProperty
[php]
get_resource_property : function(qname, callback) {
  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);
}
.........
[/php]

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
40#
 楼主| 发表于 2006-7-9 21:06 | 只看该作者
为了对 WS-ResourceFramework Web 调用 GetResourceProperty 操作,应用程序只需要提供目标 WS-Resource 的 EndpointReference 和标识被检索的属性的 WS.QName 对象即可,如清单 8 中所示。
清单 8. 最终结果
[php]
var ADDRESS = 'http://localhost:9080/SoapAjax2/services/DeviceService'

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();
    }
  );
}

............
[/php]

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表