公共 Web 服务能够让我们无须在系统中实现第三方软件而为应用程序增添很多功能。Web 应用程序的一个 Web 服务通常在服务器端使用。Web 服务的出现是为了替代由 COM、Enterprise JavaBeans 构建的业务对象,或者作为另外一个服务的一部分。其实,对于 Mozilla,我们可以使用 SOAP API 在浏览器中很容易地实现一个 Web 服务。在本文中,我将使用一个公共 Web 服务在一个 Web 页面显示当前的温度。
这里用到的 SOAP API 是一个 JavaScript 接口,它包含一组可以用来管理 SOAP 消息的对象。SOAP 是使用 Web 服务的客户和作为服务宿主的服务器之间的通信协议;这个通信是一系列包装成 XML 信封的消息。XML 提供创建复杂数据类型的强大功能,以及跨平台使用复杂数据类型的灵活性。
我要用到的 Web 服务的规范位于XMethods。这个 Web 服务接受一个邮政编码作为参数,然后返回邮政编码对应的地区的当前温度。
为了在 Mozilla 中创建 SOAP 消息,你要使用 SOAPCall 和 SOAPParameter 对象。SOAPCall 负责创建和编码 SOAP 消息,SOAPParameter 负责创建传递给 Web 服务的单个参数。在我的页面中,当页面装载时——假设我们有一个用户知道的具有偏好设置的站点——我根据用户指定的邮政编码显示本地的温度:
function window_onload() {
var soap_call = new SOAPCall();
soap_call.transportURI =
"http://services.xmethods.net:80/soap/servlet/rpcrouter";
var p = [new SOAPParameter("90210",
"zipcode")];
soap_call.encode(0, "getTemp",
"urn:xmethods-Temperature", 0, null,
p.length, p);
var temp = soap_call.invoke();
if (temp.fault) {
alert(temp.fault.faultString);
} else {
var response = [];
response =
temp.getParameters(false, {});
document.getElementById("divTemp").innerHTML = response[0].value +
"°F";
}
}
首先要做的事情是创建一个新的 SOAPCall 对象。transportURI 属性已经被设置,在<soap:address> 地址特性下的 WSDL 文件中可以找到该属性。参数作为一个 SOAPParameter 对象数组传递给 SOAPCall 对象的 encode() 方法。
Web 服务的 getTemp() 方法只有一个参数:zipcode。这个参数设置为用户定义的邮政编码;在我的例子中,用户的邮政编码是90210。
方法 encode() 接收六个参数,但是我们关心的只有四个:Web 服务名字,目标命名空间,参数数组长度和参数数组。它们分别是第二、三、五、六个参数。
方法名顾名思义,这是你希望调用的方法的名字。在 <soap:body> 输入元素的 namespace 属性下有这个 Web 服务的目标命名空间。参数数组长度就是参数数组的长度。(Length 是 JavaScript Array对象的一个属性。)参数数组是一个 SOAPParameter 的集合,该集合保存在一个 JavaScript 数组。
为了完成实际的Web 服务调用,你可以使用SOAPCall 对象的 asyncInvoke() 方法或者 invoke() 方法。两个方法的不同之处在于 asyncInvoke() 异步地调用 Web 服务方法。结果返回给一个处理响应的回调函数。方法 invoke() 将挂起脚本,直到接收一个响应。我之所以使用这个方法,是因为我所处理的并不是一个时间敏感的操作。
方法 invoke 的返回值是一个 SOAPResponse 对象。如果有一个错误发生的话,SOAPResponse 对象的 fault 属性就包含一个 SOAPFault 对象。在这种情况下,我简单地弹出一个警告框显示 SOAPFault 对象的 faultString 的值。不然的话,我还要取得返回参数并将它们保存到一个局部变量中。每个返回参数是一个对象,这个对象有三个属性:name、value 和 element。Name 是参数的名字,value 是返回参数的值,element 是指向返回的 XML 中的一个 DOM 节点的指针。对于我的目的,只返回一个参数,定义在 WSDL 中。我随便挑一个<DIV> 元素,并将它的 innerHTML 设置为返回参数的值。
如果需要更多的 Web 服务的示例,可以访问XMethods Web site。更多有关使用 Mozilla 的 SOAP API 的信息,可以访问O'Reilly Web DevCenter。