2009-05-27 5 views
11

J'essaie de créer une interface avec https://ws.farebuzz.com/FlightGateway.asmx?WSDL en utilisant php et la classe SoapClient.SOAP PHP Problème: La référence d'objet n'est pas définie sur une instance d'un objet

j'ai réussi à obtenir sur l'en-tête d'authentification mais je suis coincé lorsque je tente d'appeler une méthode .. Je suis toujours reçois:

Uncaught SoapFault exception: [soap: Server] serveur n'a pas pu traiter demande. --- > La référence d'objet n'est pas définie sur une instance d'un objet.

J'ai essayé d'appeler comme ça (comme un objet):

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

et comme un tableau comme:

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

mais je suis même erreur. Quelqu'un peut-il aider?

Merci

Sorin

Répondre

5

Essayez d'utiliser ceci:

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

j'avais des problèmes en essayant d'accéder à un .net webservice et cela a résolu le problème pour moi.

0

Si je comprends correctement le WSDL, l'objet SearchFlights est censé contenir un objet FlightSearchRequest. C'est ce dernier qui contient les paramètres.

Essayez ceci:

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

J'étais aussi curieux de connaître la réponse de cette question et finalement je suis arrivé à connaître la raison de ceci: Les nœuds que nous envoyons par requête SOAP devraient être connus nous avec les types de données et si elles sont obligatoires ou non. Donc, ici, si l'un de ces nœuds suivi par des instructions strictes de ce WSDL ne doit pas être suivi, nous obtiendrons l'erreur qui indiquera que la "référence d'objet n'est pas définie sur une instance d'un objet". Je vais vous donner un exemple auquel j'ai fait face: J'avais le même problème, et j'ai appris que je n'envoyais aucune valeur à un nœud, ce qui en excluait au moins une valeur ou une occurrence, alors Je le valide de ma part, si je réussis, j'envoyais cette chaîne sinon vide, ce qui indiquait que WSDL était au moins 1 occurrence et avait une valeur. Enfin, j'ai résolu ce bug. La ligne de base est ici, si les nœuds qui sont obligatoires et qui n'ont pas été envoyés correctement seront levés dans cette exception ou bien envoyer une chaîne vide dans ces nœuds. Merci

+1

Les paramètres obligatoires manquants ne sont pas la cause de ce problème. C'est un autre problème qui sera évident lorsque le premier problème est résolu, ce qui est la mauvaise structure d'entrée. – MrCode

6

Vos états WSDL qu'il doit être appelé de cette façon:

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

Notez que le nom searchRequest est importante.

Il existe également diverses entrées obligatoires pour ce service, vous devez vous assurer qu'elles sont présentes. En regardant votre code, il vous en manque.

Jetez un oeil au type complexe FlightSearchRequest ici. Chaque paramètre qui a minOccurs=1 est requis.

<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> 
Questions connexes