快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

金宝搏亚洲体育博彩_酒文化网进入



本文先容若何应用异步 JavaScript 和 XML (Asynchronous JavaScript and XML, AJAX) 设计模式来实现基于 Web 浏览器的 SOAP Web 办事客户机。

AJAX 已普遍用于许多有名的 Web 利用法度榜样办事,例如 GMail、Google Maps、Flickr 和 Odeo.com。经由过程应用异步 XML 消息通报,AJAX 为 Web 开拓职员供给了一种扩展其 Web 利用法度榜样代价和功能的道路。这里先容的 Web Services JavaScript Library 扩展了该根基机制,其经由过程引入对调用基于 SOAP 的 Web 办事的支持来增强 AJAX 设计模式。

从浏览器中调用 Web 办事

从 Web 浏览器中调用 SOAP Web 办事可能会对照麻烦,这是由于大年夜多半盛行的 Web 浏览器在天生和处置惩罚 XML 方面都略有不合。所有浏览器都同等实现且用于 XML 处置惩罚的标准 API 或功能少之又少。

浏览器实现职员同等支持的机制之一是 XMLHttpRequest API,它是 AJAX 设计模式的核心。developerWorks 网站近来宣布的另一篇由 Philip McCarthy 撰写的的文章具体先容了该 API。XMLHttpRequest 是一个用于履行异步 HTTP 哀求的 JavaScript 工具。Philip McCarthy 在其文章中描述了一个顺序图(请拜见图 1),此图对付理解 XMLHttpRequest 工具若何支持 AJAX 设计异常有赞助(请参阅参考资料,以得到指向全文的链接)。

图 1. Philip McCarthy 的 AJAX 顺序图

从此图中,您可以清楚地看到 XMLHttpRequest 工具是若何事情的。一些运行在 Web 浏览器内的 JavaScript 创建了一个 XMLHttpRequest 实例和一个用于异步回调的函数。然后,该脚本应用 XMLHttpRequest 工具对办事器履行 HTTP 操作。在接管到相应后,调用回调函数。在该回调函数内,可能处置惩罚返回的数据。假如返回的数据可巧是 XML,则 XMLHttpRequest 工具将自动应用浏览器中内置的 XML 处置惩罚机制来解析该数据。

遗憾的是,应用 AJAX 措施的主要难题在于 XMLHttpRequest 工具自动解析 XML 的具体历程。例如,假设我正在哀求的数据是一个 SOAP 信封,其包孕来自许多不合 XML 命名空间的元素,并且我盼望提取 yetAnotherElement 中属性 attr 的值。(请拜见清单 1)

清单 1. 一个包孕多个命名空间的 SOAP 信封

在 Mozilla 浏览器和 Firefox 浏览器中,提取 attr 属性值异常简单,如清单 2所示。

清单 2. 在 Mozilla 和 Firefox 中检索 attr 属性值的措施不能运用在 Internet Explorer 中

var m = el.getElementsByTagNameNS(

'urn:example',

'yetAnotherElement')[0].

getAttributeNS(

'urn:foo',

'attr')

alert(m); // displays 'abc'

关于安然性

因为涉及许多实际安然问题,是以在缺省环境下,大年夜多半 Web 浏览器中的 XMLHttpRequest 工具都限定为只能与用户正在查看的 Web 页所在的域中承载的资本和办事进行交互。例如,假如我正在造访一个位于 http://example.com/myapp/ 的页面,则 XMLHttpRequest 将只容许造访位于 example.com 域中的资本。对付阻拦恶意利用法度榜样代码潜在地对其不应该造访的信息进行不适当的造访,这种预防步伐异常需要。由于这里先容的 Web 办事客户机基于 XMLHttpRequest,以是这种限定同样适用于您将会调用的 Web 办事。

假如您必要能够造访位于另一个域中的 Web 办事,您可以应用以下两种合理的办理规划:

对 JavaScript 进行数字署名。经由过程对 JavaScript 脚本进行数字署名,您就奉告了 Web 浏览器可以相信该脚本不会履行任何恶意的活动,并且对 XMLHttpRequest 可以造访的数据的限定也应该取消。

应用代理。一个简单的办理规划是,经由过程位于加载的页面所在的域中的代理资本来通报所有来自 XMLHttpRequest 的哀求。该代理将 XMLHttpRequest 的哀求转发到远程位置,并将结果返回给浏览器。从 XMLHttpRequest 工具的角度来看,这种交互发生在现有的安然设置设置设备摆设摆设之内。

遗憾的是,以上代码无法在 Internet Explorer Version 6 中运行,由于该浏览器不仅没有实现 getElementsByTagNameNS 功能,而且事实上还应用了一种很糟糕的措施——将 XML 命名空间的前缀作为其元素和属性名称的一部分来对待。

Internet Explorer 缺少对 XML 命名空间的支持,这使得它很难处置惩罚命名空间密集的 XML 款式,例如采纳自力于浏览器的要领的 SOAP。纵然要履行一些像提取结果中的属性值这样简单的操作,您也必须编写能够在多个浏览器中实现同等预期行径的特殊代码。幸运的是,这种特殊代码可以封装并重用。

为了从 Web 浏览器中调用 Web 办事,并靠得住地处置惩罚 SOAP 消息,您必要首先懂得一些安然问题(请拜见侧栏“关于安然性”)。此外,您还必要编写一个 JavaScript 脚本库(图 2),以便将底层浏览器 XML 实现中的不同等环境抽象出来,从而使您能够直接处置惩罚 Web 办事数据。

图 2. 在应用 Web Services JavaScript Library 的 Web 浏览器中经由过程 Javascript 调用 Web 办事

图 2 中的 Web Services JavaScript Library (ws.js) 是一组 JavaScript 工具和实用功能,它们为基于 SOAP 1.1 的 Web 办事供给了基础的支持。Ws.js 定义了下列工具:

• WS.Call:一个包装了 XMLHttpRequest 的 Web 办事客户机

• WS.QName:XML 限制名实现

• WS.Binder:自定义 XML 序列化器/反序列化器的根基

• WS.Handler:哀求/相应处置惩罚法度榜样的根基

• SOAP.Element:包装了 XML DOM 的基础 SOAP 元素

• SOAP.Envelope:SOAP Envelope 工具扩展了 SOAP.Element

• SOAP.Header:SOAP Header 工具扩展了 SOAP.Element

• SOAP.Body:SOAP Body 工具扩展了 SOAP.Element

• XML:用于处置惩罚 XML 的跨平台实用措施

ws.js 的核心是 WS.Call 工具,该工具供给了调用 Web 办事的措施。WS.Call 主要认真与 XMLHttpRequest 工具进行交互,并处置惩罚 SOAP 相应。

WS.Call 工具公开了以下三个措施:

• add_handler。向处置惩罚链添加哀求/相应处置惩罚法度榜样。处置惩罚法度榜样工具在调用 Web 办事的前后被调用,以支持可扩展的预调用场置惩罚和后调用场置惩罚。

• invoke。将指定的 SOAP.Envelope 工具发送给 Web 办事,然后在接管到相应后调用回调函数。当调用应用文本 XML 编码的文档样式的 Web 办事时,请应用此措施。

• invoke_rpc。创建一个封装 RPC 样式哀求的 SOAP.Envelope,并将其发送到 Web 办事。当接管到响适时,调用回调函数。

在平日环境下,WS.Call 工具只不过是位于 XMLHttpRequest 工具顶层的瘦包装器 (thin wrapper),该包装器能够履行许多简化处置惩罚的操作。这些操作包括设置 SOAP 1.1 规范要求的 SOAPAction HTTP Header。

应用 ws.js

Web services JavaScript Library 供给的 API 异常简单。

SOAP.* 工具(SOAP.Element、SOAP.Envelope、SOAP.Header 和 SOAP.Body)供给了构建和读取 SOAP 信封的措施,如清单 3 所示,因而处置惩罚 XML 文档工具模型的底层细节就顺利地抽象出来。

清单 3. 构建一个 SOAP 信封

var envelope = new SOAP.Envelope();

var body = envelope.create_body();

var el = body.create_child(new WS.QName('method','urn:foo'));

el.create_child(new WS.QName('param','urn:fo金宝搏亚洲体育博彩o')).set_value('bar');

清单 4 显示了由 清单 3 中的代码天生的 SOAP 信封。

清单 4金宝搏亚洲体育博彩. 构建一个 金宝搏亚洲体育博彩SOAP 信封

bar

假如您正在创建的 SOAP 信封代表一个 RPC 样式的哀求,则 SOAP.Body 元素供给了一个简便措施 set_rpc(如清单 5 所示),该措施能够构造一个完备的 RPC 哀求——包孕一个指定的操作名称、一个指定的输入参数数组和一个 SOAP 编码样式的 URI。

清单 5. 构建一个 RPC 哀求信封

var envelope = new SOAP.Envelope();

var body = envelope.create_body();

body.set_rpc金宝搏亚洲体育博彩(

new WS.QName('param','urn:foo'),

new Array(

{name:'param',value:'bar'}

), SOAP.NOENCODING

);

每个参数都作为一个 JavaScript 工具布局进行通报,且可能带有以下属性:

• name。一个指定参数名称的字符串或 WS.QName 工具。必需。

• value。参数的值。假如该值不是一个简单数据类型(例如,字符串、整数或其他),则应该指定一个能将该值序列化为适当的 XML 布局的 WS.Binder。必需。

• xsitype:标识参数的 XML 模式实例类型的 WS.QName(例如,xsi:type="int" 对应 xsitype:new WS.QName('int','http://www.w3.org/2000/10/XMLSchema'))。可选。

• encodingstyle:标识参数所应用的 SOAP 编码样式的 URI。可选。

• binder:能够将参数序列化为 XML 的 WS.Binder 实现。可选。

例如,假如要指定的参数名为“abc”、XML 命名空间为“urn:foo”、xsi:type 为“int”且值为“3”,则我会应用以下代码:new Array({name:new WS.QName('abc','urn:foo'), value:3, xsitype:new WS.QName('int','http://www.w3.org/2000/10/XMLSchema')})。

一旦我为办事哀求构建了 SOAP.Envelope,我就会将该 SOAP.Envelope 通报到 WS.Call 工具的 invoke 措施,以便调用该信封内编码的措施: (new WS.Call(service_uri)).invoke(envelope, callback)

另一种可选规划是手动构建 SOAP.Envelope。我会将参数 WS.QName、参数数组和编码样式通报到 WS.Call 工具的 invoke_rpc 措施,如清单 6 所示。

清单 6. 应用 WS.Call 工具调用 Web 办事

var call = new WS.Call(serviceURI);

var nsuri = 'urn:foo';

var qn_op = new WS.QName('method',nsuri);

var qn_op_resp = new WS.QName('methodResponse',nsuri);

call.invoke_rpc(

qn_op,

new Array(

{name:'param',value:'bar'}

),SOAP.NOENCODING,

function(call,envelope) {

// envelope is the response SOAP.Envelope

// the XML Text of the response is in arguments[2]

}

);

在调用 invoke 措施或 invoke_rpc 措施时,WS.Call 工具会创建一个基础的 XMLHttpRequest 工具,用包孕 SOAP 信封的 XML 元素进行通报,并接管和解析相应,然后调用供给的回调函数。

为了能够扩展 SOAP 消息的预处置惩罚和后处置惩罚,WS.Call 工具容许您注册一组 WS.Handler 工具,如清单 7 所示。对付调用周期内的每个哀求、每个相应和每个差错,都将调用这些工具。可以经由过程扩展 WS.Handler JavaScript 工具来实现新的处置惩罚法度榜样。

清单 7. 创建和注册相应/相应处置惩罚法度榜样

var MyHandler = Class.create();

MyHandler.prototype = (new WS.Handler()).extend({

on_request : function(envelope) {

// pre-request processing

},

on_response : function(call,envelope) {

// post-response, pre-callback processing

},

on_error : function(call,envelope) {

}

});

var call = new WS.Call(...);

call.add_handler(new MyHandler());

处置惩罚法度榜样对插入或提取正在通报的 SOAP 信封中的信息最有用。例如,您可以设想一个处置惩罚法度榜样自动向 SOAP Envelope 的 Header 插入适当的 Web 办事寻址 (Web Services Addressing) 元素,如清单 8 中的示例所示。

清单 8. 一个将 Web 办事寻址操作 Header 添加到哀求中的处置惩罚法度榜样示例

var WSAddressingHandler = Class.create();

WSAddressingHandler.prototype = (new WS.Handler()).extend({

on_request : function(call,envelope) {

envelope.create_header金宝搏亚洲体育博彩().create_child(

new WS.QName('Action','http://ws-addressing','wsa')

).set_value('http://www.example.com');

}

});

WS.Binder 工具(清单 9)履行 SOAP.Element 工具的自定义序列化和反序列化。WS.Binder 的实现必须供给以下两个措施:

• to_soap_element。将 JavaScript 工具序列化为 SOAP.Element。传入的第一个参数是要序列化的值。第二个参数是 SOAP.Element,必须将要序列化的值序列化为 SOAP.Element。该措施不返回任何值。

• to_value_object。将 SOAP.Element 反序列化为 JavaScript 工具。该措施必须返回反序列化的值工具。

清单 9. WS.Binding 实现示例

var MyBinding = Class.create();

MyBinding.prototype = (new WS.Binding()).extend({

to_soap_element : function(value,element) {

...

},

to_value_object : function(element) {

...

}

});

一个简单示例

我已经供给了一个示例项目来阐释 Web Services JavaScript Library 的基础功能。该演示所应用的 Web 办事(如清单 10 所示)已经在 WebSphere Application Server 中进行了实现,并供给了简单的 Hello World 功能。

清单 10. 一个简单的基于 Java 的“Hello World”Web 办事

package example;

public class HelloWorld {

public String sayHello(String name) {

return "Hello " + name;

}

}

在实现了该办事并将其支配到 WebSphere Application Server 后,该办事(清单 11)的 WSDL 描述定义了您必要通报的 SOAP 消息(用于调用 Hello World 办事)。

清单 11. HelloWorld.wsdl 的代码片段

经由过程应用 Web Services JavaScript Library,您可以实现一个调用 Hello World 办事的措施,如清单 12所示。

清单 12. 应用 WS.Call 调用 HelloWorld 办事

...

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: