我基于Delcampe API编写soap-client。简单的方法工作正常,但复杂数据需要的函数给我一个错误消息,如“你必须发送项目的数据!”。基于PHP示例here我认为,该数据应该是hash或hashref,但两者都给我前面提到的错误。
我使用的示例脚本:
use 5.010;
use SOAP::Lite;
use SOAP::WSDL;
use strict;
use warnings;
use Data::Dumper;
my $API_key = 'xyz';
my $service = SOAP::Lite->service('http://api.delcampe.net/soap.php?wsdl');
my $return = $service->authenticateUser($API_key);
if ($return->{status}) {
my $key = $return->{data};
my %data = (description => 'updated description');
my $response = $service->updateItem($key, 123456, \%data);
if ($response->{status}) {
say Dumper $response->{data};
} else {
say $response->{errorMsg};
}
} else {
say "no: " . $return->{status};
}
那么,我应该使用什么样的数据结构而不是%data
,或者我如何调试作为请求生成的SOAP信封? (基于示例的PHP代码工作正常)
ADDITION
还有use SOAP::Lite qw(trace);
igot SOAP信封:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://api.delcampe.net/soap.php">
<soap:Body>
<tns:updateItem>
<token xsi:type="xsd:string">secret_one</token>
<id_item xsi:type="xsd:int">123456</id_item>
<arrData xsi:nil="true" xsi:type="soap-enc:Array" />
</tns:updateItem>
</soap:Body>
</soap:Envelope>
如上所示,没有发送任何数据。我还尝试将数据作为字符串,数组和arrayref。也许是SOAP::Lite
的错误?
答案 0 :(得分:1)
可能你试图替换
my%data =(description =&gt;'updated description');
带
my $ data = SOAP :: Data-&gt; name(description =&gt;'updated description');
我们在处理SOAP API时遇到了类似的问题,它通过类似的方式解决,将复杂数据包装到SOAP :: Data中。所以我希望这会有所帮助。 )
<强>更新强>
之前的建议没有帮助:看起来确实是SOAP :: Lite错误,它忽略了WSDL文件中的'soap-enc:Array'定义。
但终于找到了解决方法。它不漂亮,但作为最后的手段,它可能会起作用。
首先,我从Delcampe站点手动下载了WSDL文件,将其保存到本地目录中,并将其称为...
my $service = SOAP::Lite->service('file://...delcampe.wsdl')
......因为需要绝对路径。
然后我在WSDL updateItem定义中注释掉了'arrData行'。
最后,我做到了这一点:
my $little_monster = SOAP::Data->name(arrData =>
\SOAP::Data->value((
SOAP::Data->name(item =>
\SOAP::Data->value(
SOAP::Data->name(key => 'personal_reference'),
SOAP::Data->name(value => 'Some Personal Reference')->type('string'),
)
),
SOAP::Data->name(item =>
\SOAP::Data->value(
SOAP::Data->name(key => 'title'),
SOAP::Data->name(value => 'Some Amazing Title')->type('string'),
)
),
# ...
))
)->type('ns1:Map');
......而且,我承认,通过......成功将它释放到荒野中。
$service->updateItem($key, 123456, $little_monster);
......至少,它产生了更多可爱的信封。
我真诚地希望,至少可以挽救一些可怜的灵魂,不要像我在这方面所做的那样对着墙撞击。 )