花了最后一天敲打我的头,并希望有任何帮助!
我正在构建一个使用第 3 方 SOAP Web 服务的应用程序。这是基于 node.js 并使用 node-soap。不幸的是,WSDL 文件有点损坏,我需要解决它。
这是我正在使用的代码:
var url = 'http://domainexample.com/ws/connectionService.cfc?wsdl';
var session = 'super secret string'
var args = { connectionID: session }
soap.createClient(url, function (err, client) {
client.connectionService_wrapService['connectionservice.cfc'].isConnected(args, function (err, result) {
console.log(result);
});
});
这是我得到的错误。大多数其他方法都可以正常工作:
org.xml.sax.SAXException:反序列化参数\'connectionID\':找不到类型{ http://www.w3.org/2001/XMLSchema }anyType '的反序列化器
这是该方法生成的消息:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:impl="http://rpc.xml.cfml/
ws/ConnectionService.cfc" xmlns:intf="http://rpc.xml.cfml/ws/ConnectionService.cfc">
<soap:Body>
<impl:isConnected>
<connectionID>super secret string</connectionID>
</impl:isConnected>
</soap:Body>
</soap:Envelope>
我发现 WSDL 文件没有为某些方法(例如这个)的 connectionID 参数定义适当的类型属性。它应该是xsd:string,这就是我所说的有效的方法。
在玩了一些 SOAP UI 之后,我发现向 connectionID 部分添加了一个类型属性(xsi:type=xsd:string),并添加了一个模式(xmlns:xsd="http://www.w3.org/2001/XMLSchema ") 修复它。这是我需要生成的 XML:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:impl="http://rpc.xml.cfml/
ws/ConnectionService.cfc" xmlns:intf="http://rpc.xml.cfml/ws/ConnectionService.cfc">
<soap:Body>
<impl:isConnected>
<connectionID xsi:type="xsd:string">auth-string-here</connectionID>
</impl:isConnected>
</soap:Body>
</soap:Envelope>
但是我一生都无法弄清楚如何通过节点肥皂来做到这一点。我尝试使用属性键添加类型,但是它似乎仅在我在参数中有父节点和子节点时才有效。
所以,如果我把这个传下来:
var args = {
test: {
connectionID:
{
attributes: {
'xsi:type': 'xsd:string'
},
$value: session
}
}
};
我得到以下信息:
<impl:isConnected>
<test>
<connectionID xsi:type="xsd:string">super secret string</connectionID>
</test>
</impl:isConnected>
但我只需要一个级别,像这样:
var args = {
connectionID:
{
attributes: {
'xsi:type': 'xsd:string'
},
$value: session
}
};
所以我明白了:
<impl:isConnected>
<connectionID xsi:type="xsd:string">super secret string</connectionID>
</impl:isConnected>
但这似乎并没有发生。事实上,当我将它保存到单个节点时,它根本没有添加类型属性。我还需要找出一种在调用中添加额外模式的方法。我通过在soap-node核心代码中手动添加它来解决它,但这根本不干净(不过我可以忍受它)。
有任何想法吗?我对 SOAP 还很陌生,目前我的运气并不好。
谢谢!