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

时间:2012-02-17 22:10:33

标签: perl soap

我基于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的错误?

1 个答案:

答案 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);

......至少,它产生了更多可爱的信封。

我真诚地希望,至少可以挽救一些可怜的灵魂,不要像我在这方面所做的那样对着墙撞击。 )