下面一个脚本的片断将展示如何来创建信封:
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;
您可以在样例文件 e4xstockEnv.wsdd 中看到它。
使用 E4X 编写简单编排服务
在这最终的章节里,我们将服务请求者与服务提供者放在一起来创建新的编排服务。这些脚本被表示为服务,但是也允许您用来调用其他服务。有效的方式是将一些请求者逻辑放置在一个提供者中。
这里有一个简单的例子。我们将调整股票报价例子,使之允许我们可以根据货币符号来得到不同的股票价格。为了实现这个,我们将调用两个服务——一个是股票报价服务,以及一个是货币服务——并在返回给 Mozilla 客户端前综合它们的结果。幸运地,Xmethods 也有一个货币服务。
我们的脚本包含下列完整的结构:
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
}

图 3. 简单的编排服务
每次查找 WSDL 是不现实的,但是它阻止了这篇文章中对端点 URL 的修改,这里也展示了这种实现逻辑。更多的智能脚本可以缓存结果。但是,为了将这个用在 Rhino 中,我们可能要编写一个 Java 的 singleton 类。
首先要做的就是专门编写一个从 WSDL 中提取 URL 的函数,因为从 WSDL 中提取 URL 需要执行两次。
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];
}
您将注意到两件事情。首先,因为这些都将在服务器里运行,所以我们希望能够同步地执行所有这些操作,因为异步操作需要大量的”智能机制“,例如持久性保存与 Web 服务寻址(WS-Addressing)的支持。
其次,因为我们想使代码具有一些未来的实验,我们已经清除了 location 用来抽取第一个location。如果我们想做的更彻底一点,我们需要遵循 WSDL 结构来指定有我们期望的绑定的位置信息。
这里是获取货币符号的代码:
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;
}
