2009-05-27 54 views
11

Estoy intentando construir una interfaz a https://ws.farebuzz.com/FlightGateway.asmx?WSDL usando php y la clase SoapClient.PHP SOAP Problema: Referencia de objeto no establecida en una instancia de un objeto

que lograron superar el encabezado de autenticación, pero estoy atascado cuando trato de llamar a un método .. Siempre estoy recibiendo:

no detectada SoapFault excepción: [jabón: Servidor] servidor no pudo procesar solicitud. --- > Referencia de objeto no establecida en una instancia de un objeto.

He intentado llamarlo así (como objeto):

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

y como una matriz como:

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

pero tengo el mismo error. ¿Alguien puede ayudar?

Gracias

Sorin

Respuesta

5

Trate de usar esto:

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

que estaba teniendo problemas tratando de acceder a un servicio web .NET y esto lo resolvió para mí.

0

Si entiendo correctamente el WSDL, se supone que el objeto SearchFlights contiene un objeto FlightSearchRequest. Es el último que contiene los parámetros.

Prueba esto:

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

También sentía curiosidad por saber la respuesta de esta pregunta y finalmente me dieron a conocer la razón de esto: Los nodos que estamos enviando a través de solicitud SOAP deben ser conocidos nosotros con los tipos de datos y si son obligatorios o no. Entonces, si alguno de estos nodos seguido de instrucciones estrictas de WSDL no debe seguirse, obtendremos el error que indicará que la "Referencia del objeto no está configurada para una instancia de un objeto". Le daré un ejemplo al que me enfrenté: Estaba teniendo el mismo problema, y ​​llegué a saber que no estaba enviando ningún valor a un nodo, que estaba exceptuando al menos un valor o una ocurrencia de él, entonces lo valido por mi parte, si fue exitoso, estaba enviando ese valor, de lo contrario cadena vacía, lo que indicaba que WSDL tiene al menos 1 ocurrencia y tiene un valor. Finalmente, resolví este error. La línea de base aquí es, si los nodos que son obligatorios y no enviaron perfectamente subirán a esta excepción o bien enviarán cadena vacía a esos nodos. Gracias

+1

La falta de parámetros obligatorios no es la causa de este problema. Ese es otro problema que será evidente cuando se resuelva el primer problema, que es la estructura de entrada incorrecta. – MrCode

6

Sus estados WSDL que tiene que ser llamado de esta manera:

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

Tenga en cuenta que el nombre searchRequest es importante .

También hay varias entradas obligatorias para ese servicio, debe asegurarse de que estén presentes. Al mirar tu código, te falta algo.

Eche un vistazo al tipo de complejo FlightSearchRequest aquí. Se requiere cada parámetro que tenga minOccurs=1.

<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> 
Cuestiones relacionadas