我面临一个问题,我不是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返回"对象引用未设置为对象实例"错误。