| ||
|
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 设计非常有帮助(请参阅参考资料,以获得指向全文的链接)。
从此图中,您可以清楚地看到 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 中
关于安全性 由于涉及许多实际安全问题,因此在缺省情况下,大多数 Web 浏览器中的 XMLHttpRequest 对象都限制为只能与用户正在查看的 Web 页所在的域中承载的资源和服务进行交互。例如,如果我正在访问一个位于 http://example.com/myapp/ 的页面,则 XMLHttpRequest 将只允许访问位于 example.com 域中的资源。对于阻止恶意应用程序代码潜在地对其不应该访问的信息进行不适当的访问,这种预防措施非常必要。因为这里介绍的 Web 服务客户机基于 XMLHttpRequest,所以这种限制同样适用于您将会调用的 Web 服务。 如果您需要能够访问位于另一个域中的 Web 服务,您可以使用以下两种合理的解决方案:
遗憾的是,以上代码无法在 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 服务 •WS.Call:一个包装了 XMLHttpRequest 的 Web 服务客户机 在通常情况下,WS.Call 对象只不过是位于 XMLHttpRequest 对象顶层的瘦包装器 (thin wrapper),该包装器能够执行许多简化处理的操作。这些操作包括设置 SOAP 1.1 规范要求的 SOAPAction HTTP Header。 | ||

