使用Node通过https调用SOAP Web服务
我正在尝试使用node-soap https://github.com/vpulim/node-soap来调用Web服务,但是我在使用https模块时遇到问题。
在下面的代码中,我使用http ,我可以看到函数并loggingAbout
函数的describe()
。 (响应是空的,可能是因为在使用http(?)时WS被设置为这样)
var soap = require('soap'); var url = "http://XXXXX/service.svc?DocArchiveService/DocArchiveV201409"; var auth = "Basic " + new Buffer("USERXXX" + ":" + "PWYYY").toString("base64"); var args = {}; soap.createClient(url, { wsdl_headers: {Authorization: auth} }, function(err, client) { console.log(client.describe().DocArchiveV201409.DocArchiveV201409Soap.About); client.DocArchiveV201409.DocArchiveV201409Soap.About(args, function(err, result){ if (err) throw err; console.log(result); }); });
输出:
{ input: {}, output: { AboutResult: 's:string' } }
错误消息(这是好的,因为响应将是空的)
错误:完成时无法parsing响应(E:\ Qlikview \ SourceDocuments \ UnderDevelopment \ Node \ node_modules \ so ap \ lib \ client.js:383:19)
我的问题是,当使用https时,我得到一个未定义的客户端。
E:\ Qlikview \ SourceDocuments \ UnderDevelopment \ Node \ Soap.js:23 console.log(client); ^ ReferenceError:在Object.anonymous处没有定义客户端(E:\ Qlikview \ SourceDocuments \ UnderDevelopment \ Node \ Soa p.js:23:13)
有没有人用https与节点肥皂?
编辑:由于下面的结果表明我需要有证书第一。 我已经尝试使用没有证书的SoapUI,并且工作正常。 也许有一些参数createClient
我可以在node-soap中使用吗?
console.log(err)返回:
{ Error: unable to get local issuer certificate at Error (native) at TLSSocket.<anonymous> (_tls_wrap.js:1079:38) at emitNone (events.js:86:13) at TLSSocket.emit (events.js:185:7) at TLSSocket._finishInit (_tls_wrap.js:603:8) at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:433:38) code: 'UNABLE_TO_GET_IS SUER_CERT_LOCALLY' }
从tls
特定的错误中清除,你不能通过调用soap.createClient
来创buildsoap客户端。 它返回err
和undefined
客户端,这就是为什么后续调用失败。
certificate
问题背后的主要原因可以是肥皂服务器证书由internal CA
签署,或者肥皂服务器使用self-signed certificate
。
可以用来解决这个问题的可能的解决scheme是
-
[不推荐]通过在请求时禁用
SSL
检查来忽略证书特定的警告。 例如var request = require('request'); var specialRequest = request.defaults({ strictSSL: false );
-
[推荐]提供CA的root / intermediate证书来validation远程证书。
var request = require('request'); var specialRequest = request.defaults({ agentOptions: { ca: fs.readFileSync('ca.cert.pem') //path of CA cert file } );
对于这两种解决scheme,请将此specialRequest
请求传递给createClient
。
soap.createClient(url, { wsdl_headers: {Authorization: auth}, request : specialRequest }, function(err, client) { //your code });
我刚刚通过文档,并提出了解决scheme。 它可能会也可能不会工作,但值得尝试的逻辑。 我无法testing上述解决scheme,但它应该工作。
希望它可以帮助你。
- 如何在callback函数中访问app.get的'response'参数
- Node.js Express – 在完成处理整个请求之前提供HTTP响应
- Firebase Firebase部署错误的云端函数:错误parsing触发器:无法find模块'firebase-admin'“
- passport.js,在popup窗口中进行身份validation后,closures它并redirect父窗口
- NodeJSpopup警报POST方法
- Node.js中的Hello world
- mongoose静态types错误:没有这样的方法
- node.js + socket.IO – 套接字不重新连接?
- audio操作使用node.js