Blue Air API SOAP呼叫(导航)


Blue Air API SOAP Call (navitaire)

我面临一个问题,我不是PHP的新手,但我是Web服务、XML等方面的初学者。我被要求实现一个只检索可用航班的Flights Api。Blue air告诉我,我必须做以下两个步骤:

1) 使用中的登录功能登录https://0bapi.navitaire.com/SessionManager.svc并发送以下请求:

<?xml version="1.0" encoding="UTF-8" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<LogonRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/SessionService">
<logonRequestData xmlns:a="http://schemas.navitaire.com/WebServices/DataContracts/Session" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:DomainCode>EXT</a:DomainCode> 
<a:AgentName>MYUSERNAME</a:AgentName> 
<a:Password>MYPASSWORD</a:Password> 
<a:LocationCode>EXT</a:LocationCode> 
<a:RoleCode i:nil="true" /> 
<a:TerminalInfo i:nil="true" /> 
</logonRequestData>
</LogonRequest>
</s:Body>
</s:Envelope>

到目前为止还不错,我已经做了以下工作:

$request = '<LogonRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/SessionService">
<logonRequestData xmlns:a="http://schemas.navitaire.com/WebServices/DataContracts/Session" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <a:DomainCode>EXT</a:DomainCode> 
  <a:AgentName>MYUSERNAME</a:AgentName> 
  <a:Password>MYPASSWORD</a:Password> 
  <a:LocationCode>EXT</a:LocationCode> 
  <a:RoleCode i:nil="true" /> 
  <a:TerminalInfo i:nil="true" /> 
  </logonRequestData>
  </LogonRequest>
  ';

并已成功检索到稍后需要的签名密钥。

2) 使用中的GetAvailability函数https://0bapi.navitaire.com/BookingManager.svc以便得到结果。他们发给我的样品请求是:

  <?xml version="1.0" encoding="UTF-8" ?> 
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:Signature xmlns:h="http://schemas.navitaire.com/WebServices">TjPD2smLRzw=|lh90Ck0rsuAntqj8NdZk0IorrNHHgZegW2sQV3WSq3fhH4/UGkUJZh7WlhvClvceOZNcklqvC9lY7UUnhDOzPJFyZBwu8/ULevcprBFGgP/rfJsDZlwG/m2e3PKcNAZ4zVJXdvUgb/4=</h:Signature> 
    </s:Header>
  <s:Body>
  <GetAvailabilityRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/BookingService">
  <TripAvailabilityRequest xmlns="http://schemas.navitaire.com/WebServices/DataContracts/Booking" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <AvailabilityRequests>
  <AvailabilityRequest>
    <DepartureStation>OTP</DepartureStation> 
    <ArrivalStation>LCA</ArrivalStation> 
    <BeginDate>2015-03-10T00:00:00</BeginDate> 
    <EndDate>2015-03-15T00:00:00</EndDate> 
    <CarrierCode i:nil="true" /> 
    <FlightNumber i:nil="true" /> 
    <FlightType>All</FlightType> 
    <PaxCount>1</PaxCount> 
    <Dow>Daily</Dow> 
    <CurrencyCode>EUR</CurrencyCode> 
    <DisplayCurrencyCode i:nil="true" /> 
    <DiscountCode i:nil="true" /> 
    <PromotionCode i:nil="true" /> 
    <AvailabilityType>Default</AvailabilityType> 
    <SourceOrganization i:nil="true" /> 
    <MaximumConnectingFlights>0</MaximumConnectingFlights> 
    <AvailabilityFilter>Default</AvailabilityFilter> 
    <FareClassControl>LowestFareClass</FareClassControl> 
    <MinimumFarePrice>0</MinimumFarePrice> 
    <MaximumFarePrice>0</MaximumFarePrice> 
    <ProductClassCode i:nil="true" /> 
    <SSRCollectionsMode>All</SSRCollectionsMode> 
    <InboundOutbound>Both</InboundOutbound> 
    <NightsStay>0</NightsStay> 
    <IncludeAllotments>false</IncludeAllotments> 
    <BeginTime i:nil="true" /> 
    <EndTime i:nil="true" /> 
    <DepartureStations i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    <ArrivalStations i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    <FareTypes i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    <ProductClasses i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    <FareClasses i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
  <PaxPriceTypes>
  <PaxPriceType>
    <PaxType>ADT</PaxType> 
    <PaxDiscountCode i:nil="true" /> 
    </PaxPriceType>
    </PaxPriceTypes>
    <JourneySortKeys i:nil="true" xmlns:a="http://schemas.navitaire.com/WebServices/DataContracts/Common/Enumerations" /> 
    <TravelClassCodes i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    </AvailabilityRequest>
    </AvailabilityRequests>
    </TripAvailabilityRequest>
    </GetAvailabilityRequest>
    </s:Body>
    </s:Envelope>

我的代码是:

$request2='<?xml version="1.0" encoding="UTF-8" ?>'
    . '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> '
    . '<s:Header>  '
    . '<h:Signature xmlns:h="http://schemas.navitaire.com/WebServices">'
    .$result['Signature']
    .'</h:Signature> '
    . '  </s:Header>'
    . ' <s:Body>'
    . '<GetAvailabilityRequest xmlns="http://schemas.navitaire.com/WebServices/ServiceContracts/BookingService"> '
    . '<TripAvailabilityRequest xmlns="http://schemas.navitaire.com/WebServices/DataContracts/Booking" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">'
    . ' <AvailabilityRequests> '
    . '<AvailabilityRequest> '
    . ' <DepartureStation>OTP</DepartureStation> '
    . '  <ArrivalStation>LCA</ArrivalStation>  '
    . ' <BeginDate>2015-03-10T00:00:00</BeginDate>'
    . '   <EndDate>2015-03-15T00:00:00</EndDate>  '
    . ' <CarrierCode i:nil="true" />  '
    . ' <FlightNumber i:nil="true" /> '
    . '  <FlightType>All</FlightType>  '
    . ' <PaxCount>1</PaxCount>   '
    . '<Dow>Daily</Dow> '
    . '  <CurrencyCode>EUR</CurrencyCode>'
    . '   <DisplayCurrencyCode i:nil="true" /> '
    . '  <DiscountCode i:nil="true" />  '
    . ' <PromotionCode i:nil="true" />  '
    . ' <AvailabilityType>Default</AvailabilityType>  '
    . ' <SourceOrganization i:nil="true" /> '
    . '  <MaximumConnectingFlights>0</MaximumConnectingFlights>  '
    . ' <AvailabilityFilter>Default</AvailabilityFilter> '
    . '  <FareClassControl>LowestFareClass</FareClassControl> '
    . '  <MinimumFarePrice>0</MinimumFarePrice>  '
    . ' <MaximumFarePrice>0</MaximumFarePrice> '
    . '  <ProductClassCode i:nil="true" />  '
    . ' <SSRCollectionsMode>All</SSRCollectionsMode>  '
    . ' <InboundOutbound>Both</InboundOutbound> '
    . '  <NightsStay>0</NightsStay> '
    . '  <IncludeAllotments>false</IncludeAllotments>  '
    . ' <BeginTime i:nil="true" /> '
    . '  <EndTime i:nil="true" />   '
    . '<DepartureStations i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />  '
    . ' <ArrivalStations i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />  '
    . ' <FareTypes i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> '
    . '  <ProductClasses i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />  '
    . ' <FareClasses i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> '
    . ' <PaxPriceTypes> '
    . '<PaxPriceType>  '
    . '<PaxType>ADT</PaxType>   '
    . '<PaxDiscountCode i:nil="true" /> '
    . '  </PaxPriceType>  '
    . '</PaxPriceTypes> '
    . ' <JourneySortKeys i:nil="true" xmlns:a="http://schemas.navitaire.com/WebServices/DataContracts/Common/Enumerations" />   '
    . '<TravelClassCodes i:nil="true" xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />  '
    . ' </AvailabilityRequest>  '
    . '</AvailabilityRequests>'
    . '  </TripAvailabilityRequest> '
    . ' </GetAvailabilityRequest>   '
    . ' </s:Body>  '
    . '</s:Envelope>';

$client2 = new SoapClient('https://0bapi.navitaire.com/BookingManager.svc?WSDL');
$result33 = $client2->GetAvailability($request2);

我只得到这个结果:

  Fatal error: Uncaught SoapFault exception: [a:InternalServiceFault] Object reference not set to an instance of an object. 

有人有主意吗?

提前谢谢!(此外,如果有人能正确地设置问题的格式,我将非常感谢,因为我认为我太愚蠢了,弄清楚这实际上是如何工作的…)

在PHP中使用SoapClient调用函数时,需要传递一个包含参数的PHP对象,而不是XML。SoapClient为您完成所有的XML编写和读取,这使事情变得简单明了。

因此,对象引用未设置为对象的实例。

请参阅WSDL以查看对象的结构和数据类型。

虽然这是一个老问题,但本周我在另一家Navitaire航空公司遇到了"对象引用未设置为对象实例"的错误。我想我会分享我的解决方案,因为它与提供的解决方案无关,也不太明显(花了我几个小时!)。

您会在问题中提供的代码中注意到,XML中的所有元素都以大写字母开头,logonRequestData除外,它有小写字母l。有些请求有小写字母,而Navitaire系统中的大多数请求都有大写字母。至少对我来说,得到错误的情况会导致API返回"对象引用未设置为对象实例"错误。