简单的web服务与节点肥皂

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

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 

任何帮助将非常感激

在wsdl文件中,我改变的是从文档到rpc的样式,尝试使用client.js获取antoher响应

我收到的是这个输出。

 { 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' } 

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

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

请参阅我应该使用哪种WSDL风格? 讨论使用哪种风格。

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

请参阅下面的扩展版本:

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' }