【问题标题】:Simple webservice with node-soap使用 node-soap 的简单网络服务
【发布时间】:2014-04-05 17:51:03
【问题描述】:

我正在尝试使用 Node Js 和 node-soap 使用 SOAP 实现一个简单的 Web 服务,但客户端似乎在使用服务器时遇到了问题。

assert.js:92
  throw new assert.AssertionError({
        ^
AssertionError: invalid message definition for document style binding

我的 wsdl 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="wscalc1"
                  targetNamespace="http://localhost:8000/wscalc1"
                  xmlns="http://localhost:8000/wscalc1"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">

  <wsdl:message name="sumarRequest">
    <wsdl:part name="a" type="xs:string"></wsdl:part>
    <wsdl:part name="b" type="xs:string"></wsdl:part>
  </wsdl:message>

  <wsdl:message name="multiplicarRequest">
    <wsdl:part name="a" type="xs:string"></wsdl:part>
    <wsdl:part name="b" type="xs:string"></wsdl:part>
  </wsdl:message>

  <wsdl:message name="multiplicarResponse">
    <wsdl:part name="res" type="xs:string"></wsdl:part>
  </wsdl:message>

  <wsdl:message name="sumarResponse">
    <wsdl:part name="res" type="xs:string"></wsdl:part>
  </wsdl:message>


  <wsdl:portType name="calcP">
    <wsdl:operation name="sumar">
      <wsdl:input message="sumarRequest"></wsdl:input>
      <wsdl:output message="sumarResponse"></wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="multiplicar">
      <wsdl:input message="multiplicarRequest"></wsdl:input>
      <wsdl:output message="multiplicarResponse"></wsdl:output>
    </wsdl:operation>
  </wsdl:portType>

  <wsdl:binding name="calcB" type="calcP">
    <soap:binding style="document" 
                  transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="sumar">
      <soap:operation soapAction="sumar"/>
      <wsdl:input>
        <soap:body use="literal" 
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" 
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:output>
    </wsdl:operation>

    <wsdl:operation name="multiplicar">
      <soap:operation soapAction="multiplicar"/>
      <wsdl:input>
        <soap:body use="literal" 
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" 
                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>

  <wsdl:service name="ws">
    <wsdl:port name="calc" binding="calcB">
      <soap:address location="http://localhost:8000/wscalc1"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

server.js

var soap = require('soap');
var http = require('http');

var service = {
    ws: {
        calc: {
            sumar : function(args) {
                var n = args.a + args.b;
                return { res : n };
            },

            multiplicar : function(args) {
                var n = args.a * args.b;
                return { res : n }
            }
        }
    }
}

var xml = require('fs').readFileSync('wscalc1.wsdl', 'utf8'),

server = http.createServer(function(request,response) {
    response.end("404: Not Found: "+request.url)
});

server.listen(8000);
soap.listen(server, '/wscalc1', service, xml);

client.js

var soap = require('soap');
var url = 'http://localhost:8000/wscalc1?wsdl';
soap.createClient(url, function(err, client) {

    if (err) throw err;


    console.log(client.describe().ws.calc);

    client.multiplicar({"a":"1","b":"2"},function(err,res){
        if (err) throw err;

        console.log(res);
    });
});

使用该代码,输出为:

{ sumar: 
   { input: { a1: 'Request', b1: 'Request' },
     output: { res: 'Response' } },
  multiplicar: 
   { input: { a2: 'Request', b2: 'Request' },
     output: { res: 'Response' } } }

assert.js:92
  throw new assert.AssertionError({
        ^
AssertionError: invalid message definition for document style binding

任何帮助将不胜感激

【问题讨论】:

    标签: node.js web-services soap wsdl


    【解决方案1】:

    正如 user672320 指出的,client.js 失败的原因是因为使用的 wsdl 的格式是“RPC/literal”,但样式设置为“document”而不是 RPC。

    事实上,五种格式中的任何一种都可以用于 wsdl,每种格式都有不同的格式。

    请参阅Which style of WSDL should I use?,了解使用哪种样式的讨论。

    另外,给出的例子并不完整。

    扩展版本见下文:

    wsdl 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions name="wscalc1" targetNamespace="http://localhost:8000/wscalc1" xmlns="http://localhost:8000/wscalc1" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <wsdl:message name="sumarRequest">
        <wsdl:part name="a" type="xs:string"/>
        <wsdl:part name="b" type="xs:string"/>
      </wsdl:message>
      <wsdl:message name="multiplicarRequest">
        <wsdl:part name="a" type="xs:string"/>
        <wsdl:part name="b" type="xs:string"/>
      </wsdl:message>
      <wsdl:message name="multiplicarResponse">
        <wsdl:part name="mulres" type="xs:string"/>
      </wsdl:message>
      <wsdl:message name="sumarResponse">
        <wsdl:part name="sumres" type="xs:string"/>
      </wsdl:message>
      <wsdl:portType name="calcP">
        <wsdl:operation name="sumar">
          <wsdl:input message="sumarRequest"/>
          <wsdl:output message="sumarResponse"/>
        </wsdl:operation>
        <wsdl:operation name="multiplicar">
          <wsdl:input message="multiplicarRequest"/>
          <wsdl:output message="multiplicarResponse"/>
        </wsdl:operation>
      </wsdl:portType>
      <wsdl:binding name="calcB" type="calcP">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="sumar">
          <soap:operation soapAction="sumar"/>
          <wsdl:input>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
          </wsdl:input>
          <wsdl:output>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
          </wsdl:output>
        </wsdl:operation>
        <wsdl:operation name="multiplicar">
          <soap:operation soapAction="multiplicar"/>
          <wsdl:input>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
          </wsdl:input>
          <wsdl:output>
            <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="literal"/>
          </wsdl:output>
        </wsdl:operation>
      </wsdl:binding>
      <wsdl:service name="ws">
        <wsdl:port binding="calcB" name="calc">
          <soap:address location="http://localhost:8001/wscalc1"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    

    server.js:

    /*jslint node: true */
    "use strict";
    
    var soap = require('soap');
    var http = require('http');
    
    var service = {
        ws: {
            calc: {
                sumar : function(args) {
                    var n = 1*args.a + 1*args.b;
                    return { sumres : n };
                },
    
                multiplicar : function(args) {
                    var n = args.a * args.b;
                    return { mulres : n };
                }
            }
        }
    };
    
    var xml = require('fs').readFileSync('wscalc1.wsdl', 'utf8');
    
    var server = http.createServer(function(request,response) {
        response.end("404: Not Found: "+request.url);
    });
    
    server.listen(8001);
    soap.listen(server, '/wscalc1', service, xml);
    

    client.js:

    var soap = require('soap');
    var url = 'http://localhost:8001/wscalc1?wsdl';
    
    soap.createClient(url, function(err, client) {
        if (err) throw err;
        console.log(client.describe().ws.calc);
        client.multiplicar({a: 4,b: 3},function(err,res){
            if (err) throw err;
            console.log(res);
        });
        client.sumar({a: 4,b: 3},function(err,res){
            if (err) throw err;
            console.log(res);
        });
    });
    

    代码输出为:

       { sumar:
       { input: { a: 'xs:string', b: 'xs:string' },
         output: { sumres: 'xs:string' } },
      multiplicar:
       { input: { a: 'xs:string', b: 'xs:string' },
         output: { mulres: 'xs:string' } } }
       { mulres: '12' }
       { sumres: '7' }
    

    【讨论】:

    • 知道为什么命名空间是未定义的,当我使用soap调用尝试这个例子时? schemas.xmlsoap.org/soap/envelope" > 6:mulres>
    【解决方案2】:

    在 wsdl 文件中,我改变的是从文档到 rpc 的样式,试图使用 client.js 获得另一个响应

    我收到的是这个输出。

    { sumar: 
       { input: { a: 'xs:string', b: 'xs:string' },
         output: { res: 'xs:string' } },
      multiplicar: 
       { input: { a: 'xs:string', b: 'xs:string' },
         output: { res: 'xs:string' } } }
    { res: '2' }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      相关资源
      最近更新 更多