Perl: какие данные мне следует передавать в delcampe API? - PullRequest
1 голос
/ 18 февраля 2012

Я пишу мыльный клиент на основе Delcampe API.Простые методы работают хорошо, но функции с необходимостью в сложных данных выдают мне сообщение об ошибке типа «Вы должны отправить данные элемента!».Основываясь на примере PHP здесь я подумал, что данные должны быть либо хеш-значениями, либо хэш-ссылками, но оба дают мне ошибку, упомянутую ранее.

Пример сценария, который я использую:

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>

Как видно выше,нет бит данных отправлено.Я пробовал данные также как string, array и arrayref.Может быть, это ошибка SOAP::Lite?

1 Ответ

1 голос
/ 23 февраля 2012

Может быть, вы попытаетесь заменить

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

с

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

У нас есть похожие проблемы при работе с нашим SOAP API, и он был решен с помощью чего-то подобного, упаковав сложные данные в SOAP :: Data. Надеюсь, это поможет. )

UPDATE:

Предыдущий совет не помог: похоже, это действительно ошибка SOAP :: Lite, которая вообще игнорирует определение soap-enc: Array в файле WSDL.

Наконец-то нашли обходной путь. Это не красиво, но в качестве последнего средства это может сработать.

Во-первых, я вручную загрузил файл WSDL с сайта Delcampe, сохранил его в локальном каталоге и назвал его ...

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

... поскольку требуется абсолютный путь.

Затем я прокомментировал «строку arrData» в определении WSDL updateItem.

И, наконец, я сделал это:

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

... который, по крайней мере, породил более-менее привлекательный конверт.

Я искренне надеюсь, что это спасет хотя бы какую-нибудь бедную душу от удара головой о стену так же, как я работал над всем этим. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...