Node.js:如何使用SOAP XML Web服务

我想知道使用node.js来使用SOAP XML Web服务的最佳方式是什么

谢谢!

你没有那么多的select。

您可能会想要使用以下之一:

  • 节点皂
  • 强皂 (重写node-soap
  • easysoap

我认为,另一种select是:

是的,这是一个相当脏,低水平的方法,但应该没有问题

我发现使用Node.js将原始XML发送到SOAP服务最简单的方法是使用Node.js http实现。 看起来像这样

 var http = require('http'); var http_options = { hostname: 'localhost', port: 80, path: '/LocationOfSOAPServer/', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': xml.length } } var req = http.request(http_options, (res) => { console.log(`STATUS: ${res.statusCode}`); console.log(`HEADERS: ${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(`BODY: ${chunk}`); }); res.on('end', () => { console.log('No more data in response.') }) }); req.on('error', (e) => { console.log(`problem with request: ${e.message}`); }); // write data to request body req.write(xml); // xml would have been set somewhere to a complete xml document in the form of a string req.end(); 

你可能已经将xmlvariables定义为stringforms的原始xml。

但是,如果您只是想通过Node.js与SOAP服务交互并定期进行SOAP调用,而不是发送原始xml,请使用其中一个Node.js库。 我喜欢节点肥皂 。

我已经尝试了10个库“soap nodejs”,我终于手动完成了。
– 使用节点请求( https://github.com/mikeal/request )形成inputxml消息,将请求发送(POST)到Web服务
-use xml2j( https://github.com/Leonidas-from-XIV/node-xml2js )parsing响应

我在10多个跟踪WebApis(Tradetracker,Bbelboon,Affilinet,Webgains,…)上成功地使用了“肥皂”包( https://www.npmjs.com/package/soap )。

问题通常来自于这样一个事实,即程序员并没有仔细调查什么远程API需要连接或validation。

例如,PHP会自动从HTTP头重新发送cookie,但是当使用“node”包时,必须明确地设置它(例如通过“soap-cookie”包)。

我设法使用soap,wsdl和Node.js您需要使用npm install soap

创build一个名为server.js的节点服务器,该服务器将定义要由远程客户端使用的soap服务。 该肥皂服务根据体重(kg)和身高(m)计算体重指数。

 var soap = require('soap'); var express = require('express'); var app = express(); /** -this is remote service defined in this file, that can be accessed by clients, who will supply args -response is returned to the calling client -our service calculates bmi by dividing weight in kilograms by square of height in metres **/ var service = { BMI_Service : { BMI_Port :{ calculateBMI:function(args){ //console.log(Date().getFullYear()) var year = new Date().getFullYear(); var n = (args.weight)/(args.height*args.height); console.log(n); return {bmi: n}; } } } } // xml data is extracted from wsdl file created var xml = require('fs').readFileSync('./bmicalculator.wsdl','utf8'); //create an express server and pass it to a soap server var server = app.listen(3030,function(){ var host = "127.0.0.1"; var port = server.address().port; }); `soap.listen(server,'/bmicalculator',service,xml); 

接下来,创build一个client.js文件,该文件将使用由server.js定义的soap服务。 这个文件将为soap服务提供参数,并用SOAP的服务端口和端点调用url。

 var express = require('express'); var soap = require('soap'); var url = "http://localhost:3030/bmicalculator?wsdl"; var args = {weight:65.7,height:1.63}; soap.createClient(url,function(err,client){ if(err) console.error(err); else { client.calculateBMI(args,function(err,response){ if(err) console.error(err); else { console.log(response); res.send(response); } }) } }); 

您的wsdl文件是一个基于xml的数据交换协议,用于定义如何访问远程Web服务。 调用你的wsdl文件bmicalculator.wsdl

 <definitions name="HelloService" targetNamespace="http://www.examples.com/wsdl/HelloService.wsdl" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.examples.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <message name="getBMIRequest"> <part name="weight" type="xsd:float"/> <part name="height" type="xsd:float"/> </message> <message name="getBMIResponse"> <part name="bmi" type="xsd:float"/> </message> <portType name="Hello_PortType"> <operation name="calculateBMI"> <input message="tns:getBMIRequest"/> <output message="tns:getBMIResponse"/> </operation> </portType> <binding name="Hello_Binding" type="tns:Hello_PortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="calculateBMI"> <soap:operation soapAction="calculateBMI"/> <input> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/> </input> <output> <soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:examples:helloservice" use="encoded"/> </output> </operation> </binding> <service name="BMI_Service"> <documentation>WSDL File for HelloService</documentation> <port binding="tns:Hello_Binding" name="BMI_Port"> <soap:address location="http://localhost:3030/bmicalculator/" /> </port> </service> </definitions> 

希望能帮助到你

你也可以看看easysoap npm – https://www.npmjs.org/package/easysoap – 或者其中的一些: https ://nodejsmodules.org/tags/soap

https://nodejsmodules.org/pkg/express-soap2json

我使用节点networking模块打开一个到web服务的套接字。

 /* on Login request */ socket.on('login', function(credentials /* {username} {password} */){ if( !_this.netConnected ){ _this.net.connect(8081, '127.0.0.1', function() { logger.gps('('+socket.id + ') '+credentials.username+' connected to: 127.0.0.1:8081'); _this.netConnected = true; _this.username = credentials.username; _this.password = credentials.password; _this.m_RequestId = 1; /* make SOAP Login request */ soapGps('', _this, 'login', credentials.username); }); } else { /* make SOAP Login request */ _this.m_RequestId = _this.m_RequestId +1; soapGps('', _this, 'login', credentials.username); } }); 

发送肥皂请求

 /* SOAP request func */ module.exports = function soapGps(xmlResponse, client, header, data) { /* send Login request */ if(header == 'login'){ var SOAP_Headers = "POST /soap/gps/login HTTP/1.1\r\nHost: soap.example.com\r\nUser-Agent: SOAP-client/SecurityCenter3.0\r\n" + "Content-Type: application/soap+xml; charset=\"utf-8\""; var SOAP_Envelope= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<env:Envelope xmlns:env=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:SOAP-ENC=\"http://www.w3.org/2003/05/soap-encoding\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:n=\"http://www.example.com\"><env:Header><n:Request>" + "Login" + "</n:Request></env:Header><env:Body>" + "<n:RequestLogin xmlns:n=\"http://www.example.com.com/gps/soap\">" + "<n:Name>"+data+"</n:Name>" + "<n:OrgID>0</n:OrgID>" + "<n:LoginEntityType>admin</n:LoginEntityType>" + "<n:AuthType>simple</n:AuthType>" + "</n:RequestLogin></env:Body></env:Envelope>"; client.net.write(SOAP_Headers + "\r\nContent-Length:" + SOAP_Envelope.length.toString() + "\r\n\r\n"); client.net.write(SOAP_Envelope); return; } 

parsingSOAP响应,我使用了模块 – xml2js

 var parser = new xml2js.Parser({ normalize: true, trim: true, explicitArray: false }); //client.net.setEncoding('utf8'); client.net.on('data', function(response) { parser.parseString(response); }); parser.addListener('end', function( xmlResponse ) { var response = xmlResponse['env:Envelope']['env:Header']['n:Response']._; /* handle Login response */ if (response == 'Login'){ /* make SOAP LoginContinue request */ soapGps(xmlResponse, client, ''); } /* handle LoginContinue response */ if (response == 'LoginContinue') { if(xmlResponse['env:Envelope']['env:Body']['n:ResponseLoginContinue']['n:ErrCode'] == "ok") { var nTimeMsecServer = xmlResponse['env:Envelope']['env:Body']['n:ResponseLoginContinue']['n:CurrentTime']; var nTimeMsecOur = new Date().getTime(); } else { /* Unsuccessful login */ io.to(client.id).emit('Error', "invalid login"); client.net.destroy(); } } }); 

希望它可以帮助别人

如果node-soap不适合你,只需要使用node request模块,然后根据需要将xml转换为json。

我的请求没有与node-soap一起工作,除了付费支持之外,没有支持该模块,这超出了我的资源。 所以我做了以下几点:

  1. 在我的Linux机器上下载了SoapUI 。
  2. 将WSDL xml复制到本地文件
    curl http://192.168.0.28:10005/MainService/WindowsService?wsdl > wsdl_file.xml
  3. 在SoapUI中,我去了File > New Soap project并上传了我的wsdl_file.xml
  4. 在导航器中,我扩展了其中一个服务,并右键单击请求并单击Show Request Editor

从那里我可以发送一个请求,并确保它的工作,我也可以使用RawHTML数据来帮助我build立一个外部请求。

根据我的要求从SoapUI生

 POST http://192.168.0.28:10005/MainService/WindowsService HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://Main.Service/AUserService/GetUsers" Content-Length: 303 Host: 192.168.0.28:10005 Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

来自SoapUI的XML

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:qtre="http://Main.Service"> <soapenv:Header/> <soapenv:Body> <qtre:GetUsers> <qtre:sSearchText></qtre:sSearchText> </qtre:GetUsers> </soapenv:Body> </soapenv:Envelope> 

我用上面的来构build下面的node request

 var request = require('request'); let xml = `<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:qtre="http://Main.Service"> <soapenv:Header/> <soapenv:Body> <qtre:GetUsers> <qtre:sSearchText></qtre:sSearchText> </qtre:GetUsers> </soapenv:Body> </soapenv:Envelope>` var options = { url: 'http://192.168.0.28:10005/MainService/WindowsService?wsdl', method: 'POST', body: xml, headers: { 'Content-Type':'text/xml;charset=utf-8', 'Accept-Encoding': 'gzip,deflate', 'Content-Length':xml.length, 'SOAPAction':"http://Main.Service/AUserService/GetUsers" } }; let callback = (error, response, body) => { if (!error && response.statusCode == 200) { console.log('Raw result', body); var xml2js = require('xml2js'); var parser = new xml2js.Parser({explicitArray: false, trim: true}); parser.parseString(body, (err, result) => { console.log('JSON result', result); }); }; console.log('E', response.statusCode, response.statusMessage); }; request(options, callback);