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 № 1Potresti 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ò."