在现代Web开发中,Node.js因其非阻塞I/O和事件驱动的特性而受到开发者的青睐。当需要与现有的Web服务进行通信时,Node.js提供了强大的工具和库来支持这一需求。特别是当涉及到RESTful服务时,Node.js的表现尤为出色,因为REST服务在Node.js中是一等公民。然而,当需要消费SOAPWeb服务,尤其是那些使用WS-*标准(如WS-Security, MTOM等)的服务时,挑战就出现了。几个月前,当作者面临这种情况时,他发现没有现成的模块可以提供帮助,因此决定创建Ws.js库。
Ws.js是一个Node.js模块,专门用于处理SOAP服务,特别是那些使用WS-*标准的服务。以下是如何使用Ws.js库的步骤:
npm install ws.js
首先,需要导入相关的模块,然后构建SOAP请求,并发送请求。以下是一个示例代码:
var ws = require('ws.js'), Http = ws.Http, Security = ws.Security, UsernameToken = ws.UsernameToken;
var request = '' +
'' +
'' +
'' +
'123' +
' ' +
'' +
' ';
var ctx = { request: request, url: "http://service/security", action: "http://tempuri.org/EchoString", contentType: "text/xml" };
var handlers = [
new Security({}, [
new UsernameToken({username: "yaron", password: "1234"})
]),
new Http()
];
ws.send(handlers, ctx, function(ctx) {
console.log("response: " + ctx.response);
});
上述代码首先导入了Ws.js库中的相关模块。然后定义了SOAP信封和一些必要的信息,如URL。需要注意的是,Ws.js不是一个SOAP引擎,因此需要手工构建SOAP信封。接着,定义了请求中想要使用的协议。在这个特定的请求中,使用了ws-security标准,并配置了发送用户名令牌。最后,发送请求(使用指定的协议)并处理响应。
发送MTOM附件的过程非常相似,只需要指定想要发送的文件以及它对应的SOAP元素路径即可。以下是示例代码:
ws.addAttachment(ctx, "request", "//*[local-name(.)='File1']", "me.jpg", "image/jpeg");
var handlers = [
new Mtom(),
new Http()
];
目前,Ws.js支持以下协议:
SecurityHandler.prototype.send = function(ctx, callback) {
var self = this;
// actual logic here...
this.next.send(ctx, function(ctx) {
self.receive(ctx, callback);
});
}
SecurityHandler.prototype.receive = function(ctx, callback) {
// optionally post processing here...
callback(ctx);
}
var s = new SecurityHandler();
s.next = new HttpHandler();
s.send(ctx, function(ctx) {...});