Perl:我应该向delcampe API提供什么样的数据



我基于Delcampe API编写soap-client。简单的方法可以很好地工作,但需要复杂数据的函数会给我一条错误消息,比如"您必须发送项的数据!"。基于这里的PHP示例,我认为数据应该是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代码运行良好)

添加

带有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>

如上所述,没有发送任何数据。我也尝试了字符串、数组和数组形式的数据。也许是SOAP::Lite的错误?

您可能会尝试更换

my%data=(描述=>"更新的描述");

带有

my$data=SOAP::data->name(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);

这至少产生了更不讨人喜欢的信封。

我真诚地希望这能拯救至少一些可怜的人,使他们免于像我在这一切上所做的那样把头撞到墙上。)

最新更新