楼主: lastwinner

[转载] AJAX 及使用 E4X 编写 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
51#
 楼主| 发表于 2006-7-10 23:35 | 只看该作者
如果您点击 Update URL 按钮,那么将获得服务的 URL。
图 2. 使用 stockclient.html 尝试我们新的服务

现在,您可以点击 send。如果一切正常,您可以在浏览器里看到响应的 SOAP 消息结果:983。

使用道具 举报

回复
论坛徽章:
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
52#
 楼主| 发表于 2006-7-10 23:36 | 只看该作者
请注意:通常,您必须安全地运行 Axis。尽管这样还是有一定的风险,因为 E4X 提供者可以轻易的部署新脚本(甚至编写包含攻击型的代码)。记住基于 Rhino 的脚本可以轻易的调用 Java 代码。在实际生活中,您必须安全运行或是禁止 AdminService 来阻止它。

如果您想试试“信封”模型,那也是十分简单的。将下面的行:

<parameter name="type" value="body"/>

改为:

<parameter name="type" value="envelope"/>

使用道具 举报

回复
论坛徽章:
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
53#
 楼主| 发表于 2006-7-10 23:37 | 只看该作者
下面一个脚本的片断将展示如何来创建信封:

[php]
   var s = new Namespace("s",
      "http://schemas.xmlsoap.org/soap/envelope/");
   var e = <s:Envelope xmlns:s={s}/>;
   //e.s::Header="";
   e.s::Body="";
   
   // create response element here

   e.s::Body.appendChild(response);
   return e;

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

您可以在样例文件 e4xstockEnv.wsdd 中看到它。(参看下载。)

使用道具 举报

回复
论坛徽章:
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
54#
 楼主| 发表于 2006-7-10 23:38 | 只看该作者
使用 E4X 编写简单编排服务

在这最终的章节里,我们将服务请求者与服务提供者放在一起来创建新的编排服务。这些脚本被表示为服务,但是也允许您用来调用其他服务。有效的方式是将一些请求者逻辑放置在一个提供者中。

这里有一个简单的例子。我们将调整股票报价例子,使之允许我们可以根据货币符号来得到不同的股票价格。为了实现这个,我们将调用两个服务——一个是股票报价服务,以及一个是货币服务——并在返回给 Mozilla 客户端前综合它们的结果。幸运地,Xmethods 也有一个货币服务。

我们的脚本包含下列完整的结构:

[php]
function service(x) { /*body*/
        0. extract stock symbol from request body
        1. extract currency symbol from request body
        2. get WSDL for stock service and extract location
        3. get WSDL for currency service and extract location
        4. call stock service
        5. call currency service
        6. multiply
        7. create response body
        8. return
}
...........
[/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
55#
 楼主| 发表于 2006-7-10 23:38 | 只看该作者
图 3. 简单的编排服务

每次查找 WSDL 是不现实的,但是它阻止了这篇文章中对端点 URL 的修改,这里也展示了这种实现逻辑。更多的智能脚本可以缓存结果。但是,为了将这个用在 Rhino 中,我们可能要编写一个 Java 的 singleton 类。

使用道具 举报

回复
论坛徽章:
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
56#
 楼主| 发表于 2006-7-10 23:38 | 只看该作者
首先要做的就是专门编写一个从 WSDL 中提取 URL 的函数,因为从 WSDL 中提取 URL 需要执行两次。

[php]
function getAndParseWSDL(wsdlURL) {
   var  xh = new XMLHttpRequest();
    xh.open("GET", wsdlURL ,false);
    xh.send(null);
   var resp = getAsXML( xh.responseText)
   return resp..*::address.@location[0];
}

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

您将注意到两件事情。首先,因为这些都将在服务器里运行,所以我们希望能够同步地执行所有这些操作,因为异步操作需要大量的”智能机制“,例如持久性保存与 Web 服务寻址(WS-Addressing)的支持。

使用道具 举报

回复
论坛徽章:
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
57#
 楼主| 发表于 2006-7-10 23:39 | 只看该作者
其次,因为我们想使代码具有一些未来的实验,我们已经清除了 location 用来抽取第一个location。如果我们想做的更彻底一点,我们需要遵循 WSDL 结构来指定有我们期望的绑定的位置信息。

这里是获取货币符号的代码:

[php]
function getCurrencyValue(country, url) {
   var env = <s:Envelope
      xmlns:c="urn:xmethods-CurrencyExchange"
      xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
         <s:Body>
            <c:getRate>
                       <country1>US</country1>
                           <country2>{country}</country2>
            </c:getRate>
         </s:Body>
      </s:Envelope>
        response = execService(url, env);
        return response..Result;
}

.......
[/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
58#
 楼主| 发表于 2006-7-10 23:39 | 只看该作者
大多数情况下,XML 文档将从由测试客户端发出的 SOAP 消息中获取。仅有的改变是使用 {country} 来嵌入国家代码参数。

我们已经获取了股票值的代码了。完整的脚本在文件 currencystock.wsdd 中(参看下载)。主方法如下所示:
[php]

function service(x) {
   var symbol = x..*::Symbol[0].toString();
   var country = x..*::Country[0].toString();
   
   var currURL = getAndParseWSDL(
      "http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl");               
   var stockURL = getAndParseWSDL(
      "http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl");               
   
   var rate = getCurrencyValue(country, currURL);
   var ticker = getStockQuote(symbol, stockURL);
   
   var response =
      <n:getQuoteResponse xmlns:n="urn:xmethods-delayed-quotes">
         <Result>{rate*ticker}</Result>
      </n:getQuoteResponse>
   return response;
}

............
[/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
59#
 楼主| 发表于 2006-7-10 23:40 | 只看该作者
如果您已经有了上面的 Axis 例子,您可以使用下面的命令进行简单的部署:

< java org.apache.axis.client.AdminClient -l "http://localhost:8080/axis/services/AdminService" currencystock.wsdd

客户端 currencystock.html 是 stockclient.html 的一个改进版本,它包含了国家代码。一旦您部署了该服务,那么就可以浏览已经部署的服务列表:

http://localhost:8080/axis

复制 WSDL 的 URL 到客户端浏览器中并点击 Update URL。现在您可以发出请求。客户端仍旧是异步的,但是服务器是同步的,您所请求的线程将阻塞直至它完成了 4 个独立的 HTTP 请求(两个 WSDL 查找和两个服务请求)。

使用道具 举报

回复
论坛徽章:
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
60#
 楼主| 发表于 2006-7-10 23:40 | 只看该作者
结束语

在这两篇关于 E4X 与 Web 服务的文章中,我们讲述了大量的基础知识。首先,我们学习了如何使用 E4X 及一些简单的 XML 操作。然后我们讲述了使用 E4X 构建一个简单的浏览器接口,在 Mozilla 中的 XMLHttpRequest 支持用来发送 Web 服务请求及解析结果。我们使用这一模型来创建一个 AJAX 方式的客户端,它通过您输入的符号更新股票价格。

我们还讲述了服务器端,简单的 Axis 提供者,开始使用 E4X 创建一个新的 Web 服务。最后,我们将这些服务组合到一起来创建一个新的服务,它将货币与股票信息综合到一个服务中。

这篇文章中,我们自始至终关注于不同模型的 Web 服务。我们使用简单自然的 SOAP XML 或主体元素, 而不是使用 WSDL 和工具创建 stubs 或者服务的 skeletons。虽然这种方式并不象使用语言工具那样强大,例如 Java 和 C#,但是 E4X 是一个简单可行的选择。

当提到创建中间或编排服务时,从一个请求中提取信息或者 XML 元素,并将之放到另一个中。正如上面提到的代货币符号的股票例子,这一模型就变得非常的强大了。

使用道具 举报

回复

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

本版积分规则 发表回复

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