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

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

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

<br /> ###使用代码 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); })

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

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

<br />

下面几行定义了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" 
           }  

<br />

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

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

<br />

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

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>  

<br />

###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()
                ];   

整个示例在这儿。

<br /> ###支持的协议 现在Ws.js支持以下协议: • MTOM
• WS-Security (只是象征性用户名) • WS-Addressing (所有版本) • HTTP(S)

<br /> ###在幕后 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) {…})

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

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

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

<br /><br /> By Yaron Naveh From:http://www.codeproject.com/Articles/373317/Ws-js-A-Ws-implementation-for-Node-js


8 回复

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

简介

Node.js 是一个优秀的平台,用于搭建可扩展的服务器应用程序。有些应用需要与现有的网络服务进行交互。如果这些服务是基于 Restful API,那通常不会成为问题,因为 Restful API 在 Node.js 生态系统中非常成熟。然而,当应用需要与基于 SOAP 的 Web 服务交互时,特别是使用 WS-* 标准(如 WS-安全、MTOM 等),事情就会变得复杂。几个月前,当我遇到这种情况时,发现没有现成的模块可以帮助我。因此,我决定创建 Ws.js

使用代码

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

    npm install ws.js
    
  2. 编写代码 下面是一个简单的示例,展示了如何使用 Ws.js 发送一个带有 WS-安全标准的 SOAP 请求。

    const ws = require('ws.js');
    const Http = ws.Http;
    const Security = ws.Security;
    const UsernameToken = ws.UsernameToken;
    
    // 构造 SOAP 请求
    const request = `
      <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Header />
        <Body>
          <EchoString xmlns="http://tempuri.org/">
            <s>123</s>
          </EchoString>
        </Body>
      </Envelope>
    `;
    
    // 设置请求上下文
    const ctx = {
      request,
      url: "http://service/security",
      action: "http://tempuri.org/EchoString",
      contentType: "text/xml"
    };
    
    // 定义处理链
    const handlers = [
      new Security({}, [new UsernameToken({ username: "yaron", password: "1234" })]),
      new Http()
    ];
    
    // 发送请求并处理响应
    ws.send(handlers, ctx, function (ctx) {
      console.log("Response: " + ctx.response);
    });
    

分析代码

  1. 引入模块

    const ws = require('ws.js');
    const Http = ws.Http;
    const Security = ws.Security;
    const UsernameToken = ws.UsernameToken;
    
  2. 构造 SOAP 请求

    const request = `
      <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Header />
        <Body>
          <EchoString xmlns="http://tempuri.org/">
            <s>123</s>
          </EchoString>
        </Body>
      </Envelope>
    `;
    
  3. 设置请求上下文

    const ctx = {
      request,
      url: "http://service/security",
      action: "http://tempuri.org/EchoString",
      contentType: "text/xml"
    };
    
  4. 定义处理链

    const handlers = [
      new Security({}, [new UsernameToken({ username: "yaron", password: "1234" })]),
      new Http()
    ];
    
  5. 发送请求并处理响应

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

MTOM 示例

发送 MTOM 附件的过程类似,只需指定文件及其在 SOAP 请求中的位置:

// 添加附件到 SOAP 请求
ws.addAttachment(ctx, "request", "//*[local-name(.)='File1']", "me.jpg", "image/jpeg");

const handlers = [
  new Mtom(),
  new Http()
];

支持的协议

目前 Ws.js 支持以下协议:

  • MTOM
  • WS-Security(仅支持象征性用户名)
  • WS-Addressing(所有版本)
  • HTTP(S)

在幕后

Ws.js 使用了责任链设计模式来调用不同的协议。每个处理程序都有 send()receive() 方法,发送操作实际上会将控制传递给下一个处理程序,并且会调用接收方法。例如:

SecurityHandler.prototype.send = function (ctx, callback) {
  var self = this;

  // 实际逻辑...

  this.next.send(ctx, function (ctx) {
    self.receive(ctx, callback);
  });
};

SecurityHandler.prototype.receive = function (ctx, callback) {
  // 可选的后处理...

  callback(ctx);
};

const s = new SecurityHandler();
s.next = new HttpHandler();
s.send(ctx, function (ctx) { /* ... */ });

其他依赖库

Ws.js 还依赖于一些外部模块,如 xmldomxpath.js,用于 XML 处理。其他有用的库包括 node-formidablenode-bufferjs,用于 MIME 解析。

Ws.js 的未来

Ws.js 目前正处于成长阶段,未来版本计划增加更多的高级安全标准,如 X.509 数字签名和加密。如果您有任何特别需求或希望贡献代码,可以通过 GitHub 加入项目。


通过上述步骤和代码示例,您可以开始使用 Ws.js 来处理复杂的 WS-* 标准的 SOAP 通信。


我以为是这个:https://www.npmjs.org/package/ws

awesome!本以为SOA中的WS-* Protocols在WCF中通过WSHttpBinding的实现,在node中很难实现,今天,长见识了。学习学习···

ws.js还没有做到像WCF那样全面,但微软对node.js的关注很多,估计很多该有的东西都会有的。

额 不是一个,,

Ws.js 是一个基于 Node.js 的 WS-* 实现库,主要用于处理复杂的 Web 服务交互需求,如 WS-Security、MTOM 等。下面是根据你提供的内容,对 Ws.js 的使用进行简要说明和示例代码。

示例代码

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

npm install ws.js

然后编写代码来发送一个带有 WS-Security 的 SOAP 请求:

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

// 定义 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"
};

// 定义处理程序链
var handlers = [
  new Security({}, [new UsernameToken({ username: "yaron", password: "1234" })]),
  new Http()
];

// 发送请求并处理响应
ws.send(handlers, ctx, function(ctx) {
  console.log("response: " + ctx.response);
});

代码解释

  1. 引入模块

    • ws 是 Ws.js 的入口。
    • HttpSecurity 分别代表 HTTP 处理和安全处理。
    • UsernameToken 用于配置 WS-Security 中的用户名令牌。
  2. 定义请求

    • 创建一个 SOAP 请求体,包含命名空间定义。
  3. 设置上下文

    • ctx 对象包含了请求体、目标 URL、操作名称以及内容类型等信息。
  4. 配置处理链

    • handlers 数组定义了处理顺序,首先是安全处理(包含用户名令牌),其次是 HTTP 处理。
  5. 发送请求并处理响应

    • ws.send() 方法启动请求,并通过回调函数处理响应结果。

以上代码展示了如何使用 Ws.js 发送一个带 WS-Security 的 SOAP 请求,并处理返回的结果。希望这对你的需求有所帮助。

回到顶部