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

介绍

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



使用代码

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

npm install ws.js




2,写代码

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);
})



我们来分析一下这个示例。下面的代码引入了相关的模块:

var ws = require('ws.js')
  , Http = ws.Http
  , Security = ws.Security
  , UsernameToken = ws.UsernameToken




下面几行定义了soap信封和一些需要的信息比如url。注意:我们需要建带外数据的soap—因为Ws.js不是soap引擎。但通常这很容易,就如同我们有一个工作的soap实例一样。

var request =  '

 

 
  
 
  
 ' +
                  '
 
  
 
  ' +
                    '' +
                      '
 
  
 
  
    ' + ' 
   123' + ' 
  ' +
                    '' +
                '

 

 '

var ctx =  { request: request 
           , url: "http://service/security"
           , action: "http://tempuri.org/EchoString"
           , contentType: "text/xml" 
           }




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

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




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

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




最后的soap是这个样子的:

 

 
  
 
   
    
     
     
       2012-02-26T11:03:40Z 
      
     
       2012-02-26T11:08:40Z 
      
     
     
     
       yaron 
      
     
       1234 
      
     
    
  

  
 
  
 
   
   123 
  
   


 

 



MTOM实例

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

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

整个示例在这儿。



支持的协议

现在Ws.js支持以下协议:

• MTOM

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

• WS-Addressing (所有版本)

• HTTP(S)



在幕后

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

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




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

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



Ws.js的未来

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




By Yaron Naveh



你可能感兴趣的:(node.js,Ws.js)