Perl: what kind of data should i feed to delcampe API?

假装没事ソ 提交于 2019-12-24 17:15:22

问题


I write soap-client based on Delcampe API. Simple methods work fine, but functions with need on complex data give me an error message like "You must send item's data!". Based on PHP example here i thought, that data should be either hash or hashref, but both give me error mentioned before.

Sample script i use:

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};
}

So, what kind of data structure should i use instead of %data or how could i debug the SOAP-envelope, which is produced as request? (PHP code based on example works fine)

ADDITION

with use SOAP::Lite qw(trace); igot SOAP envelope too:

<?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>

As seen above, there is no bit of data sent. I tried data also as string, array and arrayref. Maybe it is bug of SOAP::Lite?


回答1:


May be you'd try to replace

my %data = (description => 'updated description');

with

my $data = SOAP::Data->name(description => 'updated description');

We have similar issues when working on our SOAP API, and it was solved by something like that, wrapping complex data into SOAP::Data. So I hope this'll help. )

UPDATE:

The previous advice didn't help: looks like it's indeed the SOAP::Lite bug, which ignores the 'soap-enc:Array' definition in WSDL file whatsoever.

Have finally found a workaround, though. It's not pretty, but as a final resort it may work.

First, I've manually downloaded the WSDL file from Delcampe site, saved it into local directory, and referred to it as ...

my $service = SOAP::Lite->service('file://...delcampe.wsdl')

... as absolute path is required.

Then I've commented out the 'arrData line' within WSDL updateItem definition.

And, finally, I've made this:

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');

... and, I confess, successfully released it into the wilderness by ...

$service->updateItem($key, 123456, $little_monster);

... which, at least, generated more-o-less likable Envelope.

I sincerely hope that'll save at least some poor soul from banging head against the wall as much as I did working on all that. )



来源:https://stackoverflow.com/questions/9336161/perl-what-kind-of-data-should-i-feed-to-delcampe-api

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!