使用 SOAP 连接到 Web 服务
Connecting to a web service using SOAP
我目前正在开发一个基于节点的应用程序,试图向基于 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>
正如你从上面看到的,我必须传入 appKey 和 mac 值,并且成功后请求这将以 xml 格式发回成功的响应和适当的响应。
我能够看到 client 对象 return 返回相应的函数,但是在调用 client.getAllDocsisVideoInfo(.. ..),我好像看到下面的错误
S:Client: Cannot find dispatch method for {}getAllDocsisVideoInfo
我不确定为什么?是因为我传递 xml 对象的方式,我如何传递示例请求?
查看 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
})
因此,在花费数小时并敲打我的脑袋之后,我能够通过覆盖命名空间前缀、删除命名空间前缀来获得成功的响应。
例如,需要将以下对象作为
传递
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] 帮助解决了这个问题。
我目前正在开发一个基于节点的应用程序,试图向基于 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>
正如你从上面看到的,我必须传入 appKey 和 mac 值,并且成功后请求这将以 xml 格式发回成功的响应和适当的响应。
我能够看到 client 对象 return 返回相应的函数,但是在调用 client.getAllDocsisVideoInfo(.. ..),我好像看到下面的错误
S:Client: Cannot find dispatch method for {}getAllDocsisVideoInfo
我不确定为什么?是因为我传递 xml 对象的方式,我如何传递示例请求?
查看 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
})
因此,在花费数小时并敲打我的脑袋之后,我能够通过覆盖命名空间前缀、删除命名空间前缀来获得成功的响应。
例如,需要将以下对象作为
传递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] 帮助解决了这个问题。