gpt4 book ai didi

node.js - 使用 node-soap 的简单网络服务

转载 作者:搜寻专家 更新时间:2023-10-31 22:25:00 25 4
gpt4 key购买 nike

我正在尝试使用 SOAP 使用 Node Js 和 node-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>

服务器.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);

客户端.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

任何帮助将不胜感激

最佳答案

正如 user672320 指出的,client.js 失败的原因是因为使用的 wsdl 格式是“RPC/literal”,但样式设置为“文档”而不是 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>

服务器.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);

客户端.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' }

关于node.js - 使用 node-soap 的简单网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22884513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com