node soap 从方法中删除 xmlns 属性

node soap remove xmlns attribute from method

我正在使用 npm soap 包来处理 soap 网络服务。

显然它是 Node.JS 生态系统中使用最广泛的 soap 客户端,我正在使用一个相当成熟的商业网络服务,所以我不知道谁是“错误的”(或不符合标准) ,但是我正在调用的方法的 xml 标记中的 xmlns 属性有问题。

我们生成这样的请求:

<?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:tns="https://webservice.com"
    xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/">
    <soap:Body>
        <MethodName xmlns="https://webservice.com">
        .......
        </MethodName>
    </soap:Body>
</soap:Envelope>

但是服务器拒绝了这个,因为它只需要 <MethodName> 而不是 <MethodName xmlns="...">。如何从请求中删除此属性?理想情况下是通过传递给客户端的选项,但我也愿意使用另一个 soap 客户端。

我也可以使用普通 http 客户端并手动构建 xml,但如果可能,我正在寻找更高级别的替代方案。

显然,strong-soap 是一个重写或者至少有一个类似的 API 所以 soap 虽然它的每月下载量较少,但它有一个更强大的社区(根据 activity 在他们各自的 support/community 聊天中)并且它不会在方法标记中注入 xmlns 属性。

因此,如果有人被 soap 困住,请尝试 strong-soap

我也遇到了同样的情况,因为 node-soap 默认情况下在信封内添加一个 xmlns,我需要替换它。最后我找到了一个解决方案,也许不是最好的,但可能对某些人有用。

您可以覆盖根据您的请求发送的数据,这样您就可以替换任何您想要的数据,包括信封。

您可以在调用方法时包含选项(对象):

Client.method(args, callback, options)

像选项一样包含此对象:

{
    transformRequest: [
        function (data, headers) {
            return data.replace(
               `xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`,
                ``
            );
        },
    ],
}

最后调用方法如下所示:

client[method](
    params,
    function (err, result) {
        if (err) console.log(err, "<<<<<ERROR");
        else console.log(result);
    }, {
        transformRequest: [
            function (data, headers) {
                return data.replace(
                  `xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`,
                  ``
                );
            },
        ],
    }
)

用这个你覆盖数据。我希望对需要更改默认创建的信封的人有用。