Ошибка PHP SOAP: ссылка на объект не установлена ​​в экземпляр объекта

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

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

Исключить исключение 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',...);

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

Спасибо

Сорин

Ответ 1

В вашем 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>

Ответ 2

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

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

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

Ответ 3

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

Попробуйте следующее:

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

Ответ 4

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