2009-05-27 15 views
11

Sto provando a creare un'interfaccia su https://ws.farebuzz.com/FlightGateway.asmx?WSDL utilizzando la classe php e SoapClient.PHP SOAP Problema: il riferimento all'oggetto non è impostato su un'istanza di un oggetto

sono riuscito a superare l'intestazione di autenticazione, ma mi sono bloccato quando provo a chiamare un metodo .. Sto ottenendo sempre:

Uncaught SoapFault eccezione: [soap: Server] Server è in grado di processo richiesta. --- > Riferimento oggetto non impostato su un'istanza di un oggetto.

Ho provato a chiamare in questo modo (come un oggetto):

class SearchFlights{ 
    public $NumberOfAdults; 
     public $ClassOfService; 
    public $TypeOfTrip; 
    public $FromCity; 
    public $ToCity; 
} 

$parameters = new SearchFlights(); 
$parameters->NumberOfAdults = 2; 
$parameters->ClassOfService = 'ECONOMY'; 
$parameters->FromCity = 'ECONOMY'; 
$parameters->ToCity = '1te'; 
$parameters->TypeOfTrip = 'NONE'; 
$this->client->SearchFlights($parameters); 

e come un array come:

$parameters = array('ToCity' => 'testttt',...); 

ma ho ottenuto lo stesso errore. Qualcuno può aiutare?

Grazie

Sorin

risposta

5

Prova ad usare questo:

$this->client->SearchFlights(array('parameters' => $parameters)); 

ho avuto problemi cercando di accedere a un webservice di .net e questo ha risolto per me.

0

Se ho capito correttamente il WSDL, l'oggetto SearchFlights dovrebbe contenere un oggetto FlightSearchRequest. È quest'ultimo che contiene i parametri.

Prova questo:

$parameters->FlightSearchRequest->NumberOfAdults = 2; 
$parameters->FlightSearchRequest->ClassOfService = 'ECONOMY'; 
// etc... 
$this->client->SearchFlights($parameters); 
0

ero anche curioso di conoscere la risposta di questa domanda e, infine, ho avuto modo di conoscere la ragione di questo: I nodi che ci stanno inviando tramite richiesta SOAP dovrebbero essere noti a noi con i tipi di dati e se sono obbligatori o meno. Quindi, se non si dovrebbe seguire uno di questi nodi seguiti da rigide istruzioni di quel WSDL, si otterrà l'errore che dirà che "il riferimento all'oggetto non è impostato su un'istanza di un oggetto". Ti darò un esempio che ho affrontato: Stavo avendo lo stesso problema, e ho avuto modo di sapere che non stavo inviando alcun valore a un nodo, che era eccetto almeno un valore o una sua occorrenza, quindi lo convalido sulla mia fine, se avessi successo, mandavo quel valore altrimenti stringa vuota, il che indicava a WSDL che questa è almeno un'occorrenza e ha un valore. Finalmente ho risolto questo errore. La linea di base qui è, se i nodi che sono obbligatori e non inviati perfettamente, solleveranno in questa eccezione o invieranno una stringa vuota in quei nodi. Grazie

+1

I parametri obbligatori mancanti non sono la causa di questo problema. Questo è un altro problema che sarà evidente quando il primo problema è risolto, che è la struttura di input sbagliata. – MrCode

6

vostri WSDL dichiara di aver a essere chiamato in questo modo:

$this->client->SearchFlights(array('searchRequest' => $parameters)); 

Nota che il nome searchRequest è importante.

Ci sono anche vari input obbligatori per quel servizio, è necessario assicurarsi che siano presenti. Guardando il tuo codice, ne manchi qualcuno.

Dai un'occhiata al tipo complesso FlightSearchRequest qui. Ogni parametro che ha minOccurs=1 è richiesto.

<s:complexType name="FlightSearchRequest"> 
    <s:sequence> 
     <s:element minOccurs="1" maxOccurs="1" name="TypeOfTrip" type="tns:TripType"/> 
     <s:element minOccurs="0" maxOccurs="1" name="FromCity" type="s:string"/> 
     <s:element minOccurs="0" maxOccurs="1" name="ToCity" type="s:string"/> 
     <s:element minOccurs="0" maxOccurs="1" name="ReturnFromCity" type="s:string"/> 
     <s:element minOccurs="0" maxOccurs="1" name="ReturnToCity" type="s:string"/> 
     <s:element minOccurs="1" maxOccurs="1" name="DepartureDate" type="s:dateTime"/> 
     <s:element minOccurs="1" maxOccurs="1" name="ReturnDate" type="s:dateTime"/> 
     <s:element minOccurs="1" maxOccurs="1" name="NumberOfAdults" type="s:int"/> 
     <s:element minOccurs="1" maxOccurs="1" name="NumberOfChildren" type="s:int"/> 
     <s:element minOccurs="1" maxOccurs="1" name="NumberOfInfantsInLap" type="s:int"/> 
     <s:element minOccurs="1" maxOccurs="1" name="NumberOfInfantsOnSeat" type="s:int"/> 
     <s:element minOccurs="1" maxOccurs="1" name="NumberOfSeniors" type="s:int"/> 
     <s:element minOccurs="0" maxOccurs="1" name="AirlinePreference" type="s:string"/> 
     <s:element minOccurs="1" maxOccurs="1" name="ClassOfService" type="tns:FlightClass"/> 
     <s:element minOccurs="1" maxOccurs="1" name="IsNonStop" type="s:boolean"/> 
     <s:element minOccurs="1" maxOccurs="1" name="ConsolidatorFaresOnly" type="s:boolean"/> 
     <s:element minOccurs="0" maxOccurs="1" name="FpAffiliate" type="s:string"/> 
     <s:element minOccurs="0" maxOccurs="1" name="FpSubAffiliate" type="s:string"/> 
    </s:sequence> 
</s:complexType> 
Problemi correlati