2013-01-16 16 views
6

Sto comunicando con un servizio web in SOAP con php. Ecco il mio codice:PHP SoapClient malformato xml

$data = array('name' => 'test', 'age' => 20); 
$WDSL = 'http://xxx.xxxxx.xxx/wdsl.ibs?wsdl'; 
$SOAP = new SoapClient($WDSL, array('trace' => true)); 
$RESULT = $SOAP->__soapCall('Some_Service', $data); 

Per qualche ragione, l'XML è sbagliato:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Some_Crap"><SOAP-ENV:Body><ns1:Some_Service/><param1>test</param1><param2>20</param2> ... 

Come mai il nome del nodo XML è paramX quando dovrebbe essere il nome della variabile? Che cosa sto facendo di sbagliato ??

Grazie

Aggiornamento: Così ho elencato le funzioni da quella webservice e quello che ottengo è:

Some_Service_Response Some_Service(Some_Service $parameters)) 

ho cambiato la mia chiamata in modo che è ora:

$SOAP->__call('Some_Service', array('Some_Service', $data)); 

E l'XML è ancora errato:

<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV=" 
http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ns1="urn:iwaysoftware:ibse:jul2003:HR_Master"><SOAP-ENV:Body><ns1:Some_Service/> 
<param1><item><key>SomeKey</key><value>SomeValue</value> .... 

ho ancora <param1><item><key>SomeKey</key><value>SomeValue</value> instead of <Somekey>SomeValue</Somekey>

Quindi la domanda è, è il servizio Web non funziona correttamente o è il mio fine?

risposta

4

Se fossi in te, proverei a impostare $ dati in un formato di oggetto.

$data = array('name' => 'test', 'age' => 20); 

Ad esempio:

$data = null; 
$data->name = "test"; 
$data->age = 20; 

$RESULT = $SOAP->__soapCall('Some_Service', $data); 
+0

È già il caso – Eric

+0

@Eric Nella domanda '$ data' è un array, non un oggetto. –

+0

Oh scusa, sì hai ragione :) – Eric

7

La classe SoapClient esegue molte correzioni basate sul WSDL del servizio, ad es. rimuove i tag non validi. Controllare il WSDL, può contenere che il nome dei parametri sia param1 e param2.

Chiamare SoapClient::__getFunctions() e SoapClient::__getTypes() e scaricare i risultati fornisce un riepilogo abbastanza buono di ciò che PHP ha compreso dal proprio WSDL.


(Dopo il PO aggiornato la domanda che dell'uscita di SoapClient::__getFunctions() è:

Some_Service_Response Some_Service(Some_Service $parameters)) 

)

Solitamente la chiave dell'array è il nome del parametro, non il tipo. Quindi la mia prima ipotesi sarebbe:

$SOAP->__call('Some_Service', array('parameters', $data)); 

Il problema potrebbe essere sul lato server però. Le incompatibilità WSDL a volte richiedono il tuning manuale dei file WSDL in modo che PHP emetta lo stesso XML che si desidera.

Ma prima di fare qualsiasi hacking (se ne hai la possibilità) assicurati di provare il servizio senza PHP per vedere la reazione del servizio a diversi file XML. Un bel programma chiamato SoapUI può farlo per te, genera automaticamente stub XML da testare. (Ho avuto solo problemi con SoapUI con servizi web che necessitavano di firme digitali.)

Sulla base dei risultati del XML test potrebbe essere necessario:

  • a mano a punto il WSDL
  • generare il file XML a mano e inviare che al server web (ultima risorsa)
  • Se l'XML è quasi corretto, richiede solo una piccola regolazione fine che può anche derivare dalla classe SoapClient e sovrascrivere il metodo SoapClient::__doRequest per eseguire manipolazioni di stringhe sul file XML prima di inviarlo al server (chiamando lo __dorequest della base classe). Un esempio, quando ho usato questa soluzione quando il servizio web richiedeva alcuni attributi XML per essere rinviato su alcuni tag.
+0

No, non c'è nulla di simile nel WSDL .. – Eric

+0

Ecco cosa ottengo: Array ([0] => struct ibsinfo {servizio stringa; stringa metodo; stringa di licenza; stringa disposizione; stringa Nome utente; stringa Password; linguaggio stringa;} [1] => struct adapterexception {stringa error;} [2] => struct Some_Service {Some_Service_ComplexType hr_master;} [3] => struct Some_Service_ComplexType { WS_Transaction_ID WS_Transaction_ID; Web_Service_Request_Type ... – Eric

+1

Inseritelo nella domanda b a) Appare lì (b) i commenti non possono avere newline per migliorare la leggibilità (c) i commenti hanno una lunghezza limitata e manca la parte interessante – Csq

Problemi correlati