如何强制使用命名空间前缀?

时间:2014-11-19 13:11:02

标签: node.js soap node-soap

我正在尝试使用SOAP Web服务,但是WSDL有点破碎,因此我必须对node-soap进行一些自定义。

我想要的理想SOAP信封就是这个:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <getImagesDefinition xmlns="http://services.example.com/"/>
    </Body>
</Envelope>

到目前为止,这是我必须调用服务的nodejs代码:

var soap = require('soap');
var url = 'http://www.example.com/services/imagesizes?wsdl';

soap.createClient(url, function(err, client) {

    client.setEndpoint('http://www.example.com/services/imagesizes');
    client.getImagesDefinition(null, function(err, result) {
        console.log(result);
    });
    console.log(client.lastRequest)

}); 

我必须手动设置端点,因为它在WSDL文件中被破坏了

打印client.lastRequest时获得的信封是:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
               xmlns:tns="http://services.example.com/">
    <soap:Body>
        <getImagesDefinition />
    </soap:Body>
</soap:Envelope>

我知道如果我可以强制主体上的命名空间前缀有<tns:getImagesDefinition />而不是<getImagesDefinition />,那么请求就可以正常运行。

我有什么方法强迫它吗?

我阅读文档说tns是默认忽略的命名空间,所以我尝试通过这样做来改变它:

var options = {
    ignoredNamespaces: {
        namespaces: [],
        override: true
    }
}

并将该对象发送到soap.createClient方法,但我发现信封没有区别。

我还有强制这个吗?或者获得理想的SOAP信封?

谢谢!

2 个答案:

答案 0 :(得分:3)

我遇到了这个问题,对我来说,修复是覆盖ignoredNamespaces - 将'tns'删除为忽略的命名空间。

var options = { 
  ignoredNamespaces: {
    namespaces: ['targetNamespace', 'typedNamespace'],
    override: true
  }
}

我不确定它为什么不适合你,但也许库中有一个错误已被修复。或许是因为你没有包含任何名称空间,而是一个空数组。

答案 1 :(得分:2)

请参阅github讨论同一问题的this帖子:

尤其如此  https://github.com/vpulim/node-soap/issues/537#issuecomment-72041420