Ws.js:基于 Node.js的WS-*实现

#介绍node

Node.js是优秀的用于搭建可扩展服务器应用程序的平台,其中的一些应用程序须要与已存在的网络服务进行交互。只要这些服务是基于Rest,就不会成为问题—由于Rest服务在node世界里是最高级公民。若是须要使用一个soap网络服务, google一下node-soap,或者本身动手作一个soap信封。真正的挑战是当node须要使用soap服务时,它用的是WS-*标准(WS-安全标准,MTOM等等)。几个月前,当我面对这一状况时,没能找到任何模块帮忙。这就是我决定建Ws.js的缘由。git

<br><br> #使用代码github

1,首先你须要安装Ws.js模块:npm

<pre> npm install ws.js </pre>windows

<br><br> 2,写代码设计模式

<pre> var ws = require('ws.js') , Http = ws.Http , Security = ws.Security , UsernameToken = ws.UsernameToken var request = '&lt;Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"&gt;' + '&lt;Header /&gt;' + '&lt;Body&gt;' + '&lt;EchoString xmlns="http://tempuri.org/"&gt;' + '&lt;s&gt;123&lt;/s&gt;' + '&lt;/EchoString&gt;' + '&lt;/Body&gt;' + '&lt;/Envelope&gt;' 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); }) </pre>安全

<br> 咱们来分析一下这个示例。下面的代码引入了相关的模块: <pre> var ws = require('ws.js') , Http = ws.Http , Security = ws.Security , UsernameToken = ws.UsernameToken </pre>服务器

<br><br> 下面几行定义了soap信封和一些须要的信息好比url。注意:咱们须要建带外数据的soap—由于Ws.js不是soap引擎。但一般这很容易,就如同咱们有一个工做的soap实例同样。网络

<pre> var request = '&lt;Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"&gt;' + '&lt;Header /&gt;' + '&lt;Body&gt;' + '&lt;EchoString xmlns="http://tempuri.org/"&gt;' + '&lt;s&gt;123&lt;/s&gt;' + '&lt;/EchoString&gt;' + '&lt;/Body&gt;' + '&lt;/Envelope&gt;' var ctx = { request: request , url: "http://service/security" , action: "http://tempuri.org/EchoString" , contentType: "text/xml" } </pre>app

<br><br> 以后的几行是ws-*的核心。咱们在请求里定义本身想要使用的协议,这个特定的请求使用ws-安全标准,并对其进行配置来发送一个象征的用户名。

<pre> var handlers = [ new Security({}, [new UsernameToken({username: "yaron", password: "1234"})]) , new Http() ] </pre>

<br><br> 最后,这条代码发送请求(使用规定的协议)并对回复进行处理。

<pre> ws.send(handlers, ctx, function(ctx) { console.log("response: " + ctx.response); }) </pre>

<br><br> 最后的soap是这个样子的:

<pre> &lt;Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"&gt; &lt;Header&gt; &lt;o:Security&gt; &lt;u:Timestamp&gt; &lt;u:Created&gt;2012-02-26T11:03:40Z&lt;/u:Created&gt; &lt;u:Expires&gt;2012-02-26T11:08:40Z&lt;/u:Expires&gt; &lt;/u:Timestamp&gt; &lt;o:UsernameToken&gt; &lt;o:Username&gt;yaron&lt;/o:Username&gt; &lt;o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"&gt;1234&lt;/o:Password&gt; &lt;/o:UsernameToken&gt; &lt;/o:Security&gt; &lt;/Header&gt; &lt;Body&gt; &lt;EchoString xmlns="http://tempuri.org/"&gt; &lt;s&gt;123&lt;/s&gt; &lt;/EchoString&gt; &lt;/Body&gt; </pre>

<br><br> #MTOM实例

发送MTOM附件的过程似曾相识,只须要指定咱们想要发送的文件,还有它对应的指向soap元素的路径:

<pre> //add attachment to the soap request ws.addAttachment(ctx, "request", "//*[local-name(.)='File1']", "me.jpg", "image/jpeg") var handlers = [ new Mtom() , new Http() ]; </pre>

整个示例在这儿。

<br><br> #支持的协议

如今Ws.js支持如下协议:

• MTOM

• WS-Security (只是象征性用户名)

• WS-Addressing (全部版本)

• HTTP(S)

<br><br> #在幕后

Ws.js用的是责任连锁设计模式,来调用不一样的协议。这是一种可扩展模式,任何人均可以添加新的协议实现。尽管对于soap堆栈来讲是一种常见模式,但在Javascript执行却有点小麻烦。关键是每一个处理程序(handler)都用一个send()和一个receive()方法,发送实际上将控制传给了下一个处理程序,咱们给那个处理程序一个回调方法。那个回调将会调用咱们的receive(),给它传递内容和最初咱们获得的回调(下游处理程序没法获得)。能看到下面的代码最好了:

<pre> 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) {...}) </pre>

<br><br> 像不少node app那样,Ws.js一样使用一些外部模块,特别是依靠强大的xml处理库。正如我在这儿提到的,要发现windows上基于node.js xml parser的dom不那么容易,最终我找到了xmldom和xpath.js。

其余Ws.js使用的有名的库是node-formidable和node-bufferjs,对于mime解析会有帮助。

<br><br> #Ws.js的将来

Ws.js框架正处于成长阶段,将来的版本,我计划添加更多高级安全标准,如x.509数字签名和加密。若是你有特别请求,发邮件到个人博客。若是想提供帮助,尽管在github加入进来—这样,Ws.js会发展很快。

<br><br> By Yaron Naveh

<br><br>

相关文章
相关标签/搜索