使用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客户端。 它返回errundefined客户端,这就是为什么后续调用失败。

certificate问题背后的主要原因可以是肥皂服务器证书由internal CA签署,或者肥皂服务器使用self-signed certificate

可以用来解决这个问题的可能的解决scheme是

  1. [不推荐]通过在请求时禁用SSL检查来忽略证书特定的警告。 例如

     var request = require('request'); var specialRequest = request.defaults({ strictSSL: false ); 
  2. [推荐]提供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,但它应该工作。

希望它可以帮助你。