/ / Perl: che tipo di dati dovrei inserire nell'API delcampe? - Perl, sapone

Perl: che tipo di dati dovrei nutrire con l'API delcampe? - Perl, sapone

Scrivo soap-client basato su API Delcampe. I metodi semplici funzionano bene, ma funzionano con necessità su dati complessi mi danno un messaggio di errore del tipo "Devi inviare i dati di un oggetto!". Basato su esempio PHP Qui Ho pensato che i dati dovrebbero essere hash o hashref, ma entrambi mi danno l'errore menzionato prima.

Script di esempio che utilizzo:

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

Quindi, che tipo di struttura dati dovrei usare al posto di %data o come posso eseguire il debug dell'inviluppo SOAP, che viene prodotto come richiesta? (Il codice PHP basato sull'esempio funziona bene)

AGGIUNTA

con use SOAP::Lite qw(trace); busta 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>

Come visto sopra, non vi è alcun bit di dati inviati. Ho provato i dati anche come stringa, array e arrayref. Forse è un bug di SOAP::Lite?

risposte:

1 per risposta № 1

Potresti provare a sostituire

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

con

my $ data = SOAP :: Data-> nome (descrizione => "descrizione aggiornata");

Abbiamo problemi simili quando lavoriamo sulla nostra API SOAP, ed è stato risolto da qualcosa del genere, avvolgendo dati complessi in SOAP :: Data. Quindi spero che questo ti aiuterà.)

AGGIORNARE:

Il consiglio precedente non ha aiutato: sembra proprio che sia il bug SOAP :: Lite, che ignora la definizione di "soap-enc: Array" nel file WSDL.

Ho finalmente trovato una soluzione alternativa, però. Non è carino, ma come ultima risorsa potrebbe funzionare.

Innanzitutto, ho scaricato manualmente il file WSDL dal sito di Delcampe, l'ho salvato nella directory locale e ho fatto riferimento ad esso come ...

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

... è richiesto il percorso assoluto.

Quindi ho commentato la "linea arrData" all'interno della definizione di updateItem di WSDL.

E, infine, ho fatto questo:

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

... e, lo confesso, rilasciato con successo nel deserto da ...

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

... che, almeno, ha generato buste più o meno simpatiche.

Spero sinceramente che "risparmi almeno una povera anima dal battere la testa contro il muro tanto quanto ho lavorato su tutto ciò."