簡體   English   中英

PHP SOAP問題:未將對象引用設置為對象的實例

[英]PHP SOAP Issue : Object reference not set to an instance of an object

我正在嘗試使用php和SoapClient類構建https://ws.farebuzz.com/FlightGateway.asmx?WSDL的界面。

我設法克服了身份驗證標題,但是當我嘗試調用方法時我被卡住了......我總是得到:

未捕獲的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',...);

但我得到了同樣的錯誤。 有人可以幫忙嗎?

謝謝

索林

您的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>

試試這個:

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

我在嘗試訪問.net webservice時遇到了問題,這為我解決了這個問題。

我也很想知道這個問題的答案,最后我知道了這個的原因:我們通過SOAP請求發送的節點應該為我們提供數據類型以及它們是否是強制的。 因此,如果這些節點中的任何一個遵循該WSDL的嚴格指令不應該被遵循,那么我們將得到錯誤,該錯誤將“對象引用未設置為對象的實例”。 我將給你一個我面臨的例子:我遇到了同樣的問題,我知道我沒有向節點發送任何值,除了至少一個值或一次出現,然后我驗證它在我的最后,如果成功我發送該值否則為空字符串,這告訴WSDL這至少是1次出現並且有一個值。 最后我解決了這個bug。 這里的基線是,如果那些是強制的並且沒有完美發送的節點將引發此異常,或者將空字符串發送到這些節點。 謝謝

如果我正確理解WSDL,則SearchFlights對象應該包含FlightSearchRequest對象。 后者包含參數。

試試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM