OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

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


分享到
分类 JS开源   关键字 Node.JS   发布 goyoo  1398826802968
注意 转载须保留原文链接,译文链接,作者译者等信息。  


介绍

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 =  '<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">' +
                  '<Header />' +
                    '<Body>' +
                      '<EchoString xmlns="http://tempuri.org/">' +
                        '<s>123</s>' +
                      '</EchoString>' +
                    '</Body>' +
                '</Envelope>'

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 =  '<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">' +
                  '<Header />' +
                    '<Body>' +
                      '<EchoString xmlns="http://tempuri.org/">' +
                        '<s>123</s>' +
                      '</EchoString>' +
                    '</Body>' +
                '</Envelope>'

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是这个样子的:

<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">
<Header>
  <o:Security>
    <u:Timestamp>
      <u:Created>2012-02-26T11:03:40Z</u:Created>
      <u:Expires>2012-02-26T11:08:40Z</u:Expires>
    </u:Timestamp>
    <o:UsernameToken>
      <o:Username>yaron</o:Username>
      <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1234</o:Password>
    </o:UsernameToken>
  </o:Security> 
</Header>
<Body>
  <EchoString xmlns="http://tempuri.org/">
    <s>123</s>
  </EchoString>
</Body>  

 

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不那么容易,最终我找到了xmldomxpath.js

 

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

 


Ws.js的未来

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

 

By Yaron Naveh

(25 Apr 2012)

原文地址: 点此
社区评论 ( Beta版 )
  • #0 傅纠舟 1429618898633

    的风格了地方看过个路口的风格

    不错! 撒地方 撒地方水电费所发生的

    1. 撒地方 撒地方 撒地方
    2. 列表 撒地方
    3. 撒地方 发都是

    ----------老四博客(web前端开发) 的说法撒地方


OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 你已经毁了JavaScript
  2. 为什么我不建议你将JavaScript作为主力语言
  3. 你用什么工具开发JavaScript?
  4. 将JavaScript 作为第一编程语言
  5. 在JavaScript里写类层次结构?别那么做!
  6. 静态web的回归
  7. 什么是最优秀的JavaScript框架?Angular or Backbone?
  8. 使用Backbone构建精美应用的7条建议
  9. OpenSSL是坑货写的
  10. 一系列JavaScript的基础工具
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS开源
  1. 开源项目:CSS 3D转换和动画学习示例教程
  2. 我为什么选择 D3.js
  3. Mozilla实验室发布的一款实时协作工具库TogetherJS
  4. 厌倦 Bootstrap 了没?来试试新玩具
  5. 不用HTML/CSS,JS就够了
  6. Tessel 开源硬件正式发布

 关键字 - Node.JS
  1. Node.JS用Path将相对路径转为绝对路径
  2. 使用Node.JS监听文件夹变化
  3. Node.JS循环删除非空文件夹及子目录下的所有文件
  4. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  5. 如何用Bootstrap免费网站模板和OnceAir云盘搭建个人网站服务器
  6. Node.JS如何查看本地MAC/IP地址、计算cpu使用率和内存容量
  7. Express入门教程:一个简单的博客
  8. 在nodejs中使用Redis缓存和查询数据及Session持久化(Express)
  9. 如何收集捕获Node中的未处理的错误异常信息?
  10. trim-html:NodeJS的HTML文本截取库(自动生成正文摘要)

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号