xml - SOAP::Lite Perl 模块发送错误的 SOAP 信封命名空间

标签 xml perl web-services soap soaplite

我在编写 SOAP/XML 客户端以与名为 Domainbox 的公司提供的 API 对话时遇到问题。我正在使用 SOAP::Lite 模块/库在 Perl 中编写客户端。我收到以下错误消息:

可能的 SOAP 版本不匹配:信封命名空间 http://schemas.xmlsoap.org/soap/envelope/出乎意料。期待http://www.w3.org/2003/05/soap-envelope .

这是因为库使用 SOAP 1.1 命名空间发送 SOAP 信封,而服务器需要 SOAP 1.2。

但我想不出一个解决方案,我试过显式设置 $soap->soapversion('1.2');在 SOAP::Lite 对象中,但这只影响响应消息中收到的信封,而不影响客户端发送的信封。

服务器正在运行 ASP.net,似乎不想接受 SOAP 1.1 版消息。

默认情况下查询 soapversion() 方法它返回版本 1.1,当我将它更改为 1.2 时它返回 1.2 但在内部它显然在某处忽略了这一点。

WSDL 似乎没有正确定义 xmlns:soap 或 xmlns:soap12,但 SOAP::Lite 也没有使用这些命名空间。我会提供一个链接,但我不能在这里发布两个以上的链接。

我也尝试过使用 SOAP::Lite 的 service() 方法,但这没有任何区别。

这是我使用的代码:

#!/usr/bin/perl -w
use strict;
use SOAP::Lite;
use Data::Dumper;

### API Info
my $reseller = 'Removed';
my $username = 'Removed';
my $password  = 'Removed';

my $soap = SOAP::Lite->new(proxy => 'https://sandbox.domainbox.net/');
$soap->default_ns('https://sandbox.domainbox.net/');
$soap->soapversion('1.2');

my $header = SOAP::Header->new->attr({xmlns => 'https://sandbox.domainbox.net/'});

my $body = SOAP::Data->name('CheckDomainAvailability' => \SOAP::Data->value(
            SOAP::Data->name('AuthenticationParameters' => \SOAP::Data->value(
                SOAP::Data->name('Reseller' => $reseller),
                SOAP::Data->name('Username' => $username),
                SOAP::Data->name('Password' => $password),
            )
        )
    )
);

$soap->on_action( sub { "https://sandbox.domainbox.net/" });
my $som = $soap->call('',
$header,
$body
);

die $som->faultstring if ($som->fault);
print $som->result, "\n";

#print Dumper($som);

附加:

信封中的 xmlns:soap 属性设置为 http://schemas.xmlsoap.org/soap/envelope无论类中的 soapversion 设置如何。我认为这是 Perl 模块中的一个错误,或者导致它的 WSDL 有什么奇怪的地方。这是 WSDL:http://sandbox.domainbox.net/?WSDL

XML 请求消息:

<?xml version="1.0" encoding="UTF-8"?><Envelope 
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org
/2001/XMLSchema-instance"><Header><c-gensym3 
xmlns="https://sandbox.domainbox.net/" /></Header><Body><DomainboxAPI 
xmlns="https://sandbox.domainbox.net/"><CheckDomainAvailability>
<AuthenticationParameters><Reseller 
xsi:type="xsd:string">Removed</Reseller><Username 
xsi:type="xsd:string">Removed</Username><Password 
xsi:type="xsd:string">Removed</Password></AuthenticationParameters>
</CheckDomainAvailability></DomainboxAPI></Body></Envelope>

XML 响应消息:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Header>
<soap12:Upgrade xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:SupportedEnvelope qname="soap12:Envelope" 
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"/></soap12:Upgrade>
</soap:Header><soap:Body><soap:Fault><soap:Code>
<soap:Value>soap:VersionMismatch</soap:Value></soap:Code><soap:Reason>
<soap:Text xml:lang="en">Possible SOAP version mismatch: Envelope 
namespace  was unexpected. Expecting http://www.w3.org/2003/05/soap-
envelope.</soap:Text></soap:Reason><soap:Detail /></soap:Fault>
</soap:Body></soap:Envelope>

更新:

谢谢 Borodin,您说对了。 SOAP::Lite 模块似乎没有将 soapversion 参数传递给 SOAP::Lite::Serializer 对象。我现在使用以下代码来初始化 SOAP 对象,它运行良好。

my $soap = SOAP::Lite->new(proxy => 'https://sandbox.domainbox.net/');
$soap->default_ns('https://sandbox.domainbox.net/');
$soap->soapversion('1.2');
$soap->serializer->soapversion('1.2');

我应该指出,我还必须调整我的代码以适应 Domainbox 要求的 XML 格式,但我现在得到了有效的响应。

我现在唯一的问题是如何处理 SOAP::Lite::SOM 作为消息结果返回的哈希引用。不过,我认为这需要一个单独的问题。

最佳答案

我的问题的答案是由 Borodin 提供的。正确的代码是对 SOAP::Lite 对象和 SOAP::Lite::Serializer 对象都使用 soapversion 方法。这是一个工作示例:

my $soap = SOAP::Lite->new(proxy => 'https://sandbox.domainbox.net/');
$soap->default_ns('https://sandbox.domainbox.net/');
$soap->soapversion('1.2');
$soap->serializer->soapversion('1.2');

关于xml - SOAP::Lite Perl 模块发送错误的 SOAP 信封命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39997155/

相关文章:

Perl:在 ./redirect 第 25 行没有包或对象引用时无法调用方法 "put"

web-services - Excel 2007/2010 如何使用 REST Web 服务?

.net - 为什么我突然在 .NET Web 服务中看到字节顺序标记?

java - Spring MVC xml配置

java - 如何生成 Checkstyle 报告?

xml - 在 XQuery 中,如何根据给定谓词递归过滤后代?

perl - 是否有解析嵌套括号的 CPAN 模块?

c# - 从大型 XML 文件中删除节点

regex - 正则表达式替换中的 Perl 尖括号

java - 带有 JSON : PUT and DELETE not working 的 RESTful Web 服务