Проблема PHP SOAP: ссылка на объект не установлена ​​для экземпляра объекта - PullRequest
11 голосов
/ 27 мая 2009

Я пытаюсь создать интерфейс для https://ws.farebuzz.com/FlightGateway.asmx?WSDL, используя php и класс SoapClient.

Мне удалось преодолеть заголовок аутентификации, но я застрял при попытке вызвать метод .. Я всегда получаю:

Uncaught SoapFault исключение: [soap: Server] Серверу не удалось обработать запрос. ---> Ссылка на объект не установлена ​​на экземпляр объекта.

Я пытался назвать это так (как объект):

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

и в виде массива, подобного:

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

но я получил ту же ошибку. Кто-нибудь может помочь?

Спасибо

Сорин

Ответы [ 4 ]

8 голосов
/ 30 мая 2012

Ваш WSDL утверждает, что он должен вызываться следующим образом:

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

Обратите внимание, что searchRequest имя важно .

Существуют также различные обязательные входные данные для этой услуги, вы должны убедиться, что они присутствуют. Просматривая свой код, вы упускаете некоторые.

Взгляните на FlightSearchRequest сложный тип здесь. Требуется каждый параметр с 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>
5 голосов
/ 05 августа 2010

Попробуйте использовать это:

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

У меня возникли проблемы при попытке доступа к веб-сервису .net, и это решило его для меня.

0 голосов
/ 30 мая 2012

Мне также было любопытно узнать ответ на этот вопрос, и, наконец, я узнал причину этого: Узлы, которые мы отправляем через SOAP-запрос, должны быть известны нам с типами данных и независимо от того, являются ли они обязательными или нет. Так что здесь, если ни один из этих узлов, за которыми следуют строгие инструкции этого WSDL, не следует выполнять, мы получим ошибку, которая скажет, что «Ссылка на объект не установлена ​​для экземпляра объекта». Я приведу вам пример, с которым я столкнулся: У меня возникла та же проблема, и я узнал, что я не отправлял никакого значения узлу, за исключением, по крайней мере, одного значения или одного его вхождения, затем я проверяю его на своем конце, если успешно отправляю это значение в противном случае пустая строка, которая сообщала WSDL, что это как минимум 1 вхождение и имеет значение. Наконец я решил эту ошибку. Базовая линия здесь такова, если узлы, которые являются обязательными и не отправлены без ошибок, перерастут в это исключение или же отправят пустую строку в эти узлы. Спасибо

0 голосов
/ 20 мая 2011

Если я правильно понимаю WSDL, объект SearchFlights должен содержать объект FlightSearchRequest. Именно последний содержит параметры.

Попробуйте это:

$parameters->FlightSearchRequest->NumberOfAdults = 2;
$parameters->FlightSearchRequest->ClassOfService = 'ECONOMY';
// etc...
$this->client->SearchFlights($parameters);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...