AJAX及使用E4X编写Web服务脚本三


浏览器的安全性

为了演示浏览器的安全性,我们使用了 xmethods.net 上可用的标准 Web 服务。但是,这里还存在一个问题,因为一般来说,浏览器的安全性规则不允许脚本程序或者 Java applet 程序创建网络连接,除非是与生成该页面的服务器建立网络连接。否则,您需要有一个监控页面,它将您的按键操作“复制”到另外一个服务器。

但是您可以避开这种操作。为实现该操作,您需要进行两步。首先,您必须启用 Mozilla 配置中的用于脚本程序的升级特权。(假定您已经下载并安装了 Mozilla 1.8 beta)。

在该浏览器的地址栏中输入 about:config,然后将 signed.applets.codebase_principal_support 的值从 false 更新为 true。(出于安全性考虑,请记得在完成全部操作后设回原值。)

然后在脚本程序中,您可以请求使用升级特权。当该脚本语言运行时,将会提示用户使用这些特权。代码行为:

netscape.security.PrivilegeManager.enablePrivilege( "UniversalXPConnect UniversalBrowserAccess");

其它的选择就是将服务和 Web 页面部署到诸如 IBM? WebSphere? Application Server 或者 Tomcat 之类的 Web 应用程序服务器中。例如,这种方式适用 Apache Axis 和 Axis 自带的缺省股票报价机样本实例。

股票报价客户端样本


该脚本程序属于 stockclient.html 的一部分。如果您从本文下载了 ws-ajax1code.zip 文件,将其中的 zip 内容解压,然后使用 Mozilla 打开 stockclient.html,您将会看到如下内容:


为了对其进行验证,首先单击 Update URL。该操作通过使用 XMLHttpRequest 对象从 http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl(或者您在 WSDL 框中键入的任意 URL)获取 WSDL 文件,然后使用 E4X 从那里获取端口地址 URL。现在单击 Send,您将会看到 SOAP 请求被填写了。一两秒钟之后,此 SOAP 响应应该同结果字段一起被更新。我们查看一下这些代码。

股票报价客户端的脚本程序

该脚本程序带着对 IBM 的股票价格的 request 调用指定的URL。如果您正在使用 Axis 服务器,那么我们建议使用股票行情自动收录机符号 XXX,这是一种特殊的符号——部署的服务将总是返回一个固定的响应用于该收录机,而不是产生 Web 请求来得到真正的股票价格——因此使用该符号进行测试会好些

您必须完成的第一个操作就是定义您希望使用的 E4X:


当您按下 Send 按钮时,该脚本程序显示如下:

var s = new Namespace(

"s",

"http://schemas.xmlsoap.org/soap/envelope/");

var envelope = ;

envelope.s::Body="";

var body = envelope.s::Body;

该操作对任何的 SOAP 请求都是通用的。它只是简单地创建了一个 SOAP 信封,而没有包括任何消息体。 该操作的一个等价实现方式如下所示:


var envelope =

 

 

 

 


但是,前面的代码会容易些,而且也为您提供了指向主体元素的指针。

下一步是要创建消息的主体:

var x = new Namespace("x","urn:xmltoday-delayed-quotes");

body.x::getQuote = ;

最后,你必须添加正确的符号:

var symbol = document.getElementById("symbol").value;

var getQuote = body.x::getQuote;

getQuote.symbol=symbol;

 

现在您已经有了一个完全成形的 SOAP 请求消息。如果您想要测试该消息信封,那么需要按照以下操作:

 

 

 

 

XXX

 

 

 

 

 


为了发送它,你必须使用 XMLHTTPRequest 对象。我们创建了一个简单的辅助函数,以支持使用 XMLHttpRequest 对象来调用使用 E4X 的服务。此 execService 函数不仅支持异步方式而且也支持同步方式。

function execService(url, xml, callback) {

var xmlhttp = new XMLHttpRequest();

var async=false;

if (arguments.length==3) async=true;

xmlhttp.open("POST", url, async);

xmlhttp.setRequestHeader("SOAPAction", "\"\"")

xmlhttp.setRequestHeader("Content-Type", "text/xml")

if (async) {

var f = function() {

if (xmlhttp.readyState==4) {

callback(new XML(xmlhttp.responseText));

}

}

xmlhttp.onreadystatechange = f;

}

xmlhttp.send(xml.toString());

if (!async) return new XML(xmlhttp.responseText);

}

下面我们来详细地看看这些代码。首先,这些代码支持两种调用方式。您可以使用其中一种:

XML execService(String url, XML envelope);或者void execService(String url, XML envelope, function callback);

在这种情况下,回调函数应该是 void callback(XML x)。

于是您可以使用该函数直接调用 XML 服务,并且等待响应,或者您也可以传送一个函数,使用 XML 响应消息调用该函数。

该函数基于参数的数量来决定它是异步还是同步(3 是异步),然后简单地使用 XMLHttpRequest 对象以 POST 请求方式来把 XML 消息放到 HTTP 请求信息,并把请求发送到指定的 URL。

我们设置了两个 HTTP 头信息——SOAPAction 和 Content-Type——然后使用 xmlhttp.send(xml.toString()) 将 SOAP 信封消息发送出去。

如果该调用行为是异步的,那么在调用从该响应创建的 XML 回调函数之前,它需要等待,直到 readyState 为 4(全部完成)。

因此使用该操作的代码如下所示:

var url = document.getElementById("url").value;

var callback = function(resp) {

alert(resp..*::getQuoteReturn);

}

execService(url, envelope, callback);

在我们的样例中,我们使用异步模型。典型的 Web 浏览器在与服务器通话时并不阻塞,并且我们也不希望它那样。举例来说,如果我们阻塞了浏览器,那么浏览器的窗口可能最终表现为“不响应”状态,从而促使用户结束它。

resp..*::getQuoteReturn

如果您是 E4X 新手,那么需要再次理解该语法。.. 意味着从树中搜索命名的元素。*:: 意味着任意的命名空间,因此该数值将是在响应 SOAP 封装的任意命名空间中被称为 getQuoteReturn 元素的数值。

实际的样本代码 stockclient.html 同样也显示了该请求和响应 SOAP 封装。测试该样本——您应该看到如下内容:


该 stockclient.html 看上去类似一个传统的使用提交按钮的 Web 页面,尽管它事实上并不是(浏览器一直在查看该页面,从未更改)。我们创建了该文件,以便您能理解交互行为。但是,真正的 AJAX 版本的页面要美观很多。此 stockclientAjax.html 没有按钮。随着您键入操作的进行,它会自动地更新股票价格。测试该样本

虽然该页面没有按钮,但是只要您停止键入操作,它就能自动地做出请求(在做出请求之前,它需要等待 0.6 秒钟,以便在您停止的时候它能够“感应”到)。

生成来自 Rhino 的 Web 服务请求

Rhino 并不支持 XMLHTTPRequest 对象,但是这个问题您不必担心。因为 Rhino 运行在 Java 环境中,您可以使用 Java 功能来生成 Web 服务请求 。为演示该操作,我们编写了一个 XMLHttpRequest 对象的简单 Java 实现。Rhino 允许 Java 程序员发布 Java 语言来扩展它们的 JavaScript 环境。为了使用 Rhino shell 中的 XMLHttpRequest 对象,您只需确保 e4xutils.jar 在自己的类路径中,然后您就可以使用 shell 命令,defineClass,将其添加到自己的环境中:

> set classpath=.\js.jar;.\xbean.jar;.\e4xutils.jar;.

> java org.mozilla.javascript.tools.shell.Main

Rhino 1.6 release 1 2004 11 30H

js> defineClass(’xmlhttp.XMLHttpRequest’);

下面有个很简单的脚本程序对其进行测试:

> test.js

defineClass("xmlhttp.XMLHttpRequest");

var xh = new XMLHttpRequest();

xh.open("GET",

"http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl",

false);

xh.send(null);

var wsdl = new XML(xh.responseText);

print(wsdl..*::address.@location);

> java org.mozilla.javascript.tools.shell.Main test.js

本文作者:
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3