0

我目前正在开发一个基于节点的应用程序,试图向基于 SOAP 的服务发出请求。我正在使用 node-soap 模块来解决这个问题。 https://github.com/vpulim/node-soap

目前我有以下实现

var soap = require('soap');
var url = 'http:/xxxx/xxxx/xxxx?WSDL';
var appKey = 'ABYRCEE';
var xml = {
    appKey: appKey,
    mac: 'xxxxxxxx'
}

soap.createClient(url, function(err, client){
    //console.log('Client:', client);
    client.getAllDocsisVideoInfo(xml, function(err, result){
       if(err){
           console.log(err);
       }
    });
});

为了让服务响应,我有一个 xml 格式的示例请求,如下所示

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:doc="http://xxx.xxx.com">

   <soapenv:Header/>

   <soapenv:Body>

      <doc:getAllDocsisVideoInfo>

         <appKey>"appKey"</appKey>

         <mac>xxxxxxx</mac>

      </doc:getAllDocsisVideoInfo>

   </soapenv:Body>

</soapenv:Envelope>

从上面可以看出,我必须传入appKeymac值,并且在成功请求后,这将以 xml 格式发送回带有适当响应的成功响应。

我能够看到客户端对象使用适当的函数返回,但是在调用client.getAllDocsisVideoInfo(....)时,我似乎看到了以下错误

S:Client:找不到 {}getAllDocsisVideoInfo 的调度方法

我不确定为什么?是因为我传递 xml 对象的方式,我如何传递示例请求?

4

2 回答 2

0

因此,在花了几个小时在这上面敲了敲头之后,我能够通过删除命名空间前缀来覆盖命名空间前缀来获得成功的响应。

例如,需要将以下对象传递为

var xml = {
    ':appKey': appKey,
    ':mac': 'xxxxxxxx'
}

反而

var xml = {
    appKey: appKey,
    mac: 'xxxxxxxx'
}

这段 node-soap 文档 [ https://github.com/vpulim/node-soap#overriding-the-namespace-prefix][1]帮助解决了这个问题。

于 2016-03-24T01:58:07.373 回答
0

查看 node-soap api:

https://www.npmjs.com/package/soap

看起来您必须以下列方式调用该函数:

client.getAllDocsisVideoInfo(xml, function(err, result, raw, soapHeader){

})

如果您想像在代码中那样调用它,那么我认为您需要使用以下内容:

从 API 复制和粘贴...

client.MyService.MyPort.MyFunction({name: 'value'}, function(err, result) {
      // result is a javascript object 
  })
于 2016-03-23T21:36:44.980 回答