如何在节点soap中添加"namespace"以请求

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.

如何强制将此命名空间添加到方法本身?

Ade*_*dem 9

我找到了如何做到这一点.由于"soap"模块中的错误,我认为它在默认情况下不起作用.默认情况下,它不会将命名空间添加到请求正文."soap"默认使用"tns"作为命名空间.wsdlOptions中有一个选项.它是overrideRootElement.如果您尝试覆盖overrideRootElementtns,它不会添加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