11

我正在尝试使用 SOAP Webservice,但 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 信封?

谢谢!

4

2 回答 2

5

我遇到了这个确切的问题,对我来说,解决方法是覆盖被忽略的命名空间 - 将“tns”作为被忽略的命名空间删除。

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

我不确定为什么它对您不起作用,但也许库中存在一个已修复的错误。或者可能是因为您没有包含任何名称空间,而是包含一个空数组。

于 2016-05-20T17:38:19.980 回答
3

请参阅在 github 上讨论相同问题的此线程:

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

于 2015-02-03T11:14:06.210 回答