Ade*_*dem 7 soap namespaces node.js npm
我从wsdl文件创建了Web服务对象,并在下面调用它.我也打印结果.这段代码不起作用.Web服务器返回错误.因为,请求没有命名空间.
soap.createClient(__dirname + '/wsdl/getCustomerDetails.wsdl', function(err, client) {
.
.
var params= {"custId":"123"};
client.getCustomerDetails.getCustomerDetailsPort.getCustomerDetails(params,function(err,result){
console.log("lastRequest:"+client.lastRequest);
if (err != null)
console.log("error:"+JSON.stringfy(error));
});
}
Run Code Online (Sandbox Code Playgroud)
这是我在上一个请求中看到的内容
<soap:... xmlns:tns="http://example.com/api/getCustomerDetails/V01" >
....
<soap:Body>
<getCustomerDetailsRequest>
<custId>123</custId>
</getCustomerDetailsRequest>
</soap:Body>...
Run Code Online (Sandbox Code Playgroud)
但它必须是
<soap:... xmlns:tns="http://example.com/api/getCustomerDetails/V01" >
....
<soap:Body>
<tns:getCustomerDetailsRequest>
<tns:custId>123</tns:custId>
</tns:getCustomerDetailsRequest>
</soap:Body>...
Run Code Online (Sandbox Code Playgroud)
如您所见,soap模块不会tns向请求添加命名空间.我试过var params= {"tns:custId":"123"};,它为参数添加了命名空间,但它仍然没有为命令添加命名空间getCustomerDetailsRequest.因为那样,我明白了Unexpected element getCustomerDetailsRequest found. Expected {http://example.com/api/getCustomerDetails/V01}getCustomerDetailsRequest.
如何强制将此命名空间添加到方法本身?
我找到了如何做到这一点.由于"soap"模块中的错误,我认为它在默认情况下不起作用.默认情况下,它不会将命名空间添加到请求正文."soap"默认使用"tns"作为命名空间.wsdlOptions中有一个选项.它是overrideRootElement.如果您尝试覆盖overrideRootElement有tns,它不会添加tns到请求主体.您必须使用不同的命名空间overrideRootElement.我的解决方案,
我首先创建我的wsdlOptions对象.
var wsdlOptions = {
"overrideRootElement": {
"namespace": "myns",
"xmlnsAttributes": [{
"name": "xmlns:myns",
"value": "http://example.com/api/getCustomerDetails/V01"
}]
}
};
Run Code Online (Sandbox Code Playgroud)
然后在我创建soap客户端时使用它,
soap.createClient(__dirname + '/wsdl/getCustomerDetails.wsdl',wsdlOptions, function(err, client) {
.
.
.
}
);
Run Code Online (Sandbox Code Playgroud)
它使请求体myns用作根元素的命名空间.现在,我必须修改参数的命名空间,所以我将参数定义为
var params= {"myns:custId":"123"};
Run Code Online (Sandbox Code Playgroud)
现在,它创建请求
<soap:... xmlns:tns="http://example.com/api/getCustomerDetails/V01" >
....
<soap:Body>
<myns:getCustomerDetailsRequest xmlns:myns="http://example.com/api/getCustomerDetails/V01">
<myns:custId>123</tns:custId>
</myns:getCustomerDetailsRequest>
</soap:Body>...
Run Code Online (Sandbox Code Playgroud)
现在,webserver接受了它.
请记住,即使tns是在根目录中定义,它也不会自动添加到请求体中.另外,如果你试图重写它wsdlOptions通过tns再次,它仍然无法正常工作.你必须使用不同的值作为命名空间,比如myns