如何在 PHP SoapClient() 中重复对象 0 次或多次?
How do I repeat an object 0 or more times in PHP SoapClient()?
我正在使用一种叫做 Radixx ConnectPoint (SOAP) 的东西,我 运行 在如何正确地请求信息方面遇到了一些小问题。如果这是显而易见的,我们深表歉意;我对 SOAP 很陌生。
出于测试目的,我有这个 XML 示例,API 开发人员发送给我来模拟我的请求:
POST http://xxx.connectpoint.uat.radixx.com/ConnectPoint.Pricing.svc HTTP/1.0
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/IConnectPoint_Pricing/RetrieveFareQuote"
Content-Length: 4076
Host: xxx.connectpoint.uat.radixx.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_77)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:rad="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Request" xmlns:rad1="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Pricing.Request.FareQuote">
<soapenv:Header/>
<soapenv:Body>
<tem:RetrieveFareQuote>
<!--Optional:-->
<tem:RetrieveFareQuoteRequest>
<rad:SecurityGUID>7fa327412a4a47hbu39fi87erfk0tan5ra580cd0a08e</rad:SecurityGUID>
<rad:CarrierCodes>
<!--Zero or more repetitions:-->
<rad:CarrierCode><rad:AccessibleCarrierCode>xxx</rad:AccessibleCarrierCode></rad:CarrierCode>
</rad:CarrierCodes>
<!--Optional:-->
<rad:ClientIPAddress>?</rad:ClientIPAddress>
<!--Optional:-->
<rad:HistoricUserName>?</rad:HistoricUserName>
<rad1:CurrencyOfFareQuote>USD</rad1:CurrencyOfFareQuote>
<rad1:PromotionalCode></rad1:PromotionalCode>
<rad1:IataNumberOfRequestor></rad1:IataNumberOfRequestor>
<rad1:CorporationID>-214</rad1:CorporationID>
<rad1:FareFilterMethod>NoCombinabilityRoundtripLowestFarePerFareType</rad1:FareFilterMethod>
<rad1:FareGroupMethod>WebFareTypes</rad1:FareGroupMethod>
<rad1:InventoryFilterMethod>Available</rad1:InventoryFilterMethod>
<rad1:FareQuoteDetails>
<!--Zero or more repetitions:-->
<rad1:FareQuoteDetail>
<rad1:Origin>BRL</rad1:Origin>
<rad1:Destination>ORD</rad1:Destination>
<rad1:UseAirportsNotMetroGroups>false</rad1:UseAirportsNotMetroGroups>
<!--Optional:-->
<rad1:UseAirportsNotMetroGroupsAsRule>false</rad1:UseAirportsNotMetroGroupsAsRule>
<!--Optional:-->
<rad1:UseAirportsNotMetroGroupsForFrom>false</rad1:UseAirportsNotMetroGroupsForFrom>
<!--Optional:-->
<rad1:UseAirportsNotMetroGroupsForTo>false</rad1:UseAirportsNotMetroGroupsForTo>
<rad1:DateOfDeparture>2016-11-20</rad1:DateOfDeparture>
<rad1:FareTypeCategory>1</rad1:FareTypeCategory>
<rad1:FareClass></rad1:FareClass>
<rad1:FareBasisCode></rad1:FareBasisCode>
<rad1:Cabin></rad1:Cabin>
<rad1:LFID>-214</rad1:LFID>
<rad1:OperatingCarrierCode></rad1:OperatingCarrierCode>
<rad1:MarketingCarrierCode></rad1:MarketingCarrierCode>
<rad1:NumberOfDaysBefore>0</rad1:NumberOfDaysBefore>
<rad1:NumberOfDaysAfter>0</rad1:NumberOfDaysAfter>
<rad1:LanguageCode>en</rad1:LanguageCode>
<rad1:TicketPackageID>1</rad1:TicketPackageID>
<rad1:FareQuoteRequestInfos>
<!--Zero or more repetitions:-->
<rad1:FareQuoteRequestInfo>
<rad1:PassengerTypeID>1</rad1:PassengerTypeID>
<rad1:TotalSeatsRequired>1</rad1:TotalSeatsRequired>
</rad1:FareQuoteRequestInfo>
<rad1:FareQuoteRequestInfo>
<rad1:PassengerTypeID>5</rad1:PassengerTypeID>
<rad1:TotalSeatsRequired>1</rad1:TotalSeatsRequired>
</rad1:FareQuoteRequestInfo>
<rad1:FareQuoteRequestInfo>
<rad1:PassengerTypeID>6</rad1:PassengerTypeID>
<rad1:TotalSeatsRequired>1</rad1:TotalSeatsRequired>
</rad1:FareQuoteRequestInfo>
</rad1:FareQuoteRequestInfos>
<!--Optional:-->
</rad1:FareQuoteDetail>
</rad1:FareQuoteDetails>
</tem:RetrieveFareQuoteRequest>
</tem:RetrieveFareQuote>
</soapenv:Body>
</soapenv:Envelope>
我已经删除了承运人识别代码并将其替换为 xxx。 GUID 安全代码不再有效,所以我把它留在里面了。
$data->CurrencyOfFareQuote = "USD";
$data->CorporationID = -214;
$data->FareFilterMethod = "NoCombinabilityRoundtripLowestFarePerFareType";
$data->FareGroupMethod = "WebFareTypes";
$data->InventoryFilterMethod = "Available";
$data->ClientIPAddress = "?"; // Optional
$data->HistoricUserName = "?"; // Optional
$data->PromotionalCode = null;
$data->IataNumberOfRequestor = null;
$data->FareQuoteDetails->FareQuoteDetail->Origin = "BRL";
$data->FareQuoteDetails->FareQuoteDetail->Destination = "ORD";
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroups = false;
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroupsAsRule = false;
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroupsForForm = false;
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroupsForTo = false;
$data->FareQuoteDetails->FareQuoteDetail->DateOfDeparture = "2016-11-20";
$data->FareQuoteDetails->FareQuoteDetail->FareTypeCategory = 1;
$data->FareQuoteDetails->FareQuoteDetail->FareClass = null;
$data->FareQuoteDetails->FareQuoteDetail->FareBasisCode = null;
$data->FareQuoteDetails->FareQuoteDetail->Cabin = null;
$data->FareQuoteDetails->FareQuoteDetail->LFID = -214;
$data->FareQuoteDetails->FareQuoteDetail->OperatingCarrierCode = null;
$data->FareQuoteDetails->FareQuoteDetail->MarketingCarrierCode = null;
$data->FareQuoteDetails->FareQuoteDetail->NumberOfDaysBefore = 0;
$data->FareQuoteDetails->FareQuoteDetail->NumberOfDaysAfter = 0;
$data->FareQuoteDetails->FareQuoteDetail->LanguageCode = "en";
$data->FareQuoteDetails->FareQuoteDetail->TicketPackageID = 1;
$quote = $pricing->RetrieveFareQuote(array("RetrieveFareQuoteRequest" => $data));
print_r($quote);
有一次我 运行 print_r 我看到我忘记添加 FareQuoteRequestInfos 对象,但是在查看 XML 之后我不确定如何添加它。从XML,看来我也必须对 FareQuoteDetail 对象做同样的事情,因为它需要能够重复。
我怎么会做这样的事?我是否将它们添加为数组?
作为参考,这里是 print_r 结果:
stdClass Object
(
[RetrieveFareQuoteResult] => stdClass Object
(
[CommissionIncluded] =>
[Exceptions] => stdClass Object
(
[ExceptionInformation.Exception] => stdClass Object
(
[ExceptionCode] => 9989
[ExceptionDescription] => RetrieveFareQuote/FareQuoteDetails[0]/FareQuoteRequestInfos: cannot be NULL and collection count must be between 1 and 20
[ExceptionSource] => RetrieveFareQuote
[ExceptionLevel] => Critical
)
)
[FlightSegments] => stdClass Object
(
)
[LegDetails] => stdClass Object
(
)
[RequestedCorporationID] => 0
[RequestedCurrencyOfFareQuote] =>
[RequestedFareFilterMethod] => 0
[RequestedGroupMethod] => 0
[RequestedIataNumber] =>
[RequestedInventoryFilterMethod] => 0
[RequestedPromotionalCode] =>
[RequestedReservationChannel] => 0
[SegmentDetails] => stdClass Object
(
)
[TaxDetails] => stdClass Object
(
)
)
)
如有任何帮助或提示,我们将不胜感激!谢谢!
自己想通了并决定分享:
$info = new StdClass;
$info->Origin = "BRL";
$info->Destination = "ORD";
$info->UseAirportsNotMetroGroups = false;
$info->UseAirportsNotMetroGroupsAsRule = false;
$info->UseAirportsNotMetroGroupsForForm = false;
$info->UseAirportsNotMetroGroupsForTo = false;
$info->DateOfDeparture = "2016-11-20";
$info->FareTypeCategory = 1;
$info->FareClass = null;
$info->FareBasisCode = null;
$info->Cabin = null;
$info->LFID = -214;
$info->OperatingCarrierCode = null;
$info->MarketingCarrierCode = null;
$info->NumberOfDaysBefore = 0;
$info->NumberOfDaysAfter = 0;
$info->LanguageCode = "en";
$info->TicketPackageID = 1;
$info->FareQuoteRequestInfos->FareQuoteRequestInfo[] = array(
'PassengerTypeID' => 1,
'TotalSeatsRequired' => 1
);
$info->FareQuoteRequestInfos->FareQuoteRequestInfo[] = array(
'PassengerTypeID' => 5,
'TotalSeatsRequired' => 1
);
$info->FareQuoteRequestInfos->FareQuoteRequestInfo[] = array(
'PassengerTypeID' => 6,
'TotalSeatsRequired' => 1
);
$detail = new StdClass;
$detail->FareQuoteDetail = $info;
$data->CurrencyOfFareQuote = "USD";
$data->CorporationID = -214;
$data->FareFilterMethod = "NoCombinabilityRoundtripLowestFarePerFareType";
$data->FareGroupMethod = "WebFareTypes";
$data->InventoryFilterMethod = "Available";
$data->ClientIPAddress = "?"; // Optional
$data->HistoricUserName = "?"; // Optional
$data->PromotionalCode = null;
$data->IataNumberOfRequestor = null;
$data->FareQuoteDetails = $detail;
$quote = $pricing->RetrieveFareQuote(array("RetrieveFareQuoteRequest" => $data));
print_r($quote);
我将 FareQuoteDetail 移动到一个单独的 class 对象中,然后将每个 FareQuoteRequestInfo 添加为一个数组,这样我就可以保持相同的命名结构。
我正在使用一种叫做 Radixx ConnectPoint (SOAP) 的东西,我 运行 在如何正确地请求信息方面遇到了一些小问题。如果这是显而易见的,我们深表歉意;我对 SOAP 很陌生。
出于测试目的,我有这个 XML 示例,API 开发人员发送给我来模拟我的请求:
POST http://xxx.connectpoint.uat.radixx.com/ConnectPoint.Pricing.svc HTTP/1.0
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/IConnectPoint_Pricing/RetrieveFareQuote"
Content-Length: 4076
Host: xxx.connectpoint.uat.radixx.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_77)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:rad="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Request" xmlns:rad1="http://schemas.datacontract.org/2004/07/Radixx.ConnectPoint.Pricing.Request.FareQuote">
<soapenv:Header/>
<soapenv:Body>
<tem:RetrieveFareQuote>
<!--Optional:-->
<tem:RetrieveFareQuoteRequest>
<rad:SecurityGUID>7fa327412a4a47hbu39fi87erfk0tan5ra580cd0a08e</rad:SecurityGUID>
<rad:CarrierCodes>
<!--Zero or more repetitions:-->
<rad:CarrierCode><rad:AccessibleCarrierCode>xxx</rad:AccessibleCarrierCode></rad:CarrierCode>
</rad:CarrierCodes>
<!--Optional:-->
<rad:ClientIPAddress>?</rad:ClientIPAddress>
<!--Optional:-->
<rad:HistoricUserName>?</rad:HistoricUserName>
<rad1:CurrencyOfFareQuote>USD</rad1:CurrencyOfFareQuote>
<rad1:PromotionalCode></rad1:PromotionalCode>
<rad1:IataNumberOfRequestor></rad1:IataNumberOfRequestor>
<rad1:CorporationID>-214</rad1:CorporationID>
<rad1:FareFilterMethod>NoCombinabilityRoundtripLowestFarePerFareType</rad1:FareFilterMethod>
<rad1:FareGroupMethod>WebFareTypes</rad1:FareGroupMethod>
<rad1:InventoryFilterMethod>Available</rad1:InventoryFilterMethod>
<rad1:FareQuoteDetails>
<!--Zero or more repetitions:-->
<rad1:FareQuoteDetail>
<rad1:Origin>BRL</rad1:Origin>
<rad1:Destination>ORD</rad1:Destination>
<rad1:UseAirportsNotMetroGroups>false</rad1:UseAirportsNotMetroGroups>
<!--Optional:-->
<rad1:UseAirportsNotMetroGroupsAsRule>false</rad1:UseAirportsNotMetroGroupsAsRule>
<!--Optional:-->
<rad1:UseAirportsNotMetroGroupsForFrom>false</rad1:UseAirportsNotMetroGroupsForFrom>
<!--Optional:-->
<rad1:UseAirportsNotMetroGroupsForTo>false</rad1:UseAirportsNotMetroGroupsForTo>
<rad1:DateOfDeparture>2016-11-20</rad1:DateOfDeparture>
<rad1:FareTypeCategory>1</rad1:FareTypeCategory>
<rad1:FareClass></rad1:FareClass>
<rad1:FareBasisCode></rad1:FareBasisCode>
<rad1:Cabin></rad1:Cabin>
<rad1:LFID>-214</rad1:LFID>
<rad1:OperatingCarrierCode></rad1:OperatingCarrierCode>
<rad1:MarketingCarrierCode></rad1:MarketingCarrierCode>
<rad1:NumberOfDaysBefore>0</rad1:NumberOfDaysBefore>
<rad1:NumberOfDaysAfter>0</rad1:NumberOfDaysAfter>
<rad1:LanguageCode>en</rad1:LanguageCode>
<rad1:TicketPackageID>1</rad1:TicketPackageID>
<rad1:FareQuoteRequestInfos>
<!--Zero or more repetitions:-->
<rad1:FareQuoteRequestInfo>
<rad1:PassengerTypeID>1</rad1:PassengerTypeID>
<rad1:TotalSeatsRequired>1</rad1:TotalSeatsRequired>
</rad1:FareQuoteRequestInfo>
<rad1:FareQuoteRequestInfo>
<rad1:PassengerTypeID>5</rad1:PassengerTypeID>
<rad1:TotalSeatsRequired>1</rad1:TotalSeatsRequired>
</rad1:FareQuoteRequestInfo>
<rad1:FareQuoteRequestInfo>
<rad1:PassengerTypeID>6</rad1:PassengerTypeID>
<rad1:TotalSeatsRequired>1</rad1:TotalSeatsRequired>
</rad1:FareQuoteRequestInfo>
</rad1:FareQuoteRequestInfos>
<!--Optional:-->
</rad1:FareQuoteDetail>
</rad1:FareQuoteDetails>
</tem:RetrieveFareQuoteRequest>
</tem:RetrieveFareQuote>
</soapenv:Body>
</soapenv:Envelope>
我已经删除了承运人识别代码并将其替换为 xxx。 GUID 安全代码不再有效,所以我把它留在里面了。
$data->CurrencyOfFareQuote = "USD";
$data->CorporationID = -214;
$data->FareFilterMethod = "NoCombinabilityRoundtripLowestFarePerFareType";
$data->FareGroupMethod = "WebFareTypes";
$data->InventoryFilterMethod = "Available";
$data->ClientIPAddress = "?"; // Optional
$data->HistoricUserName = "?"; // Optional
$data->PromotionalCode = null;
$data->IataNumberOfRequestor = null;
$data->FareQuoteDetails->FareQuoteDetail->Origin = "BRL";
$data->FareQuoteDetails->FareQuoteDetail->Destination = "ORD";
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroups = false;
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroupsAsRule = false;
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroupsForForm = false;
$data->FareQuoteDetails->FareQuoteDetail->UseAirportsNotMetroGroupsForTo = false;
$data->FareQuoteDetails->FareQuoteDetail->DateOfDeparture = "2016-11-20";
$data->FareQuoteDetails->FareQuoteDetail->FareTypeCategory = 1;
$data->FareQuoteDetails->FareQuoteDetail->FareClass = null;
$data->FareQuoteDetails->FareQuoteDetail->FareBasisCode = null;
$data->FareQuoteDetails->FareQuoteDetail->Cabin = null;
$data->FareQuoteDetails->FareQuoteDetail->LFID = -214;
$data->FareQuoteDetails->FareQuoteDetail->OperatingCarrierCode = null;
$data->FareQuoteDetails->FareQuoteDetail->MarketingCarrierCode = null;
$data->FareQuoteDetails->FareQuoteDetail->NumberOfDaysBefore = 0;
$data->FareQuoteDetails->FareQuoteDetail->NumberOfDaysAfter = 0;
$data->FareQuoteDetails->FareQuoteDetail->LanguageCode = "en";
$data->FareQuoteDetails->FareQuoteDetail->TicketPackageID = 1;
$quote = $pricing->RetrieveFareQuote(array("RetrieveFareQuoteRequest" => $data));
print_r($quote);
有一次我 运行 print_r 我看到我忘记添加 FareQuoteRequestInfos 对象,但是在查看 XML 之后我不确定如何添加它。从XML,看来我也必须对 FareQuoteDetail 对象做同样的事情,因为它需要能够重复。
我怎么会做这样的事?我是否将它们添加为数组?
作为参考,这里是 print_r 结果:
stdClass Object
(
[RetrieveFareQuoteResult] => stdClass Object
(
[CommissionIncluded] =>
[Exceptions] => stdClass Object
(
[ExceptionInformation.Exception] => stdClass Object
(
[ExceptionCode] => 9989
[ExceptionDescription] => RetrieveFareQuote/FareQuoteDetails[0]/FareQuoteRequestInfos: cannot be NULL and collection count must be between 1 and 20
[ExceptionSource] => RetrieveFareQuote
[ExceptionLevel] => Critical
)
)
[FlightSegments] => stdClass Object
(
)
[LegDetails] => stdClass Object
(
)
[RequestedCorporationID] => 0
[RequestedCurrencyOfFareQuote] =>
[RequestedFareFilterMethod] => 0
[RequestedGroupMethod] => 0
[RequestedIataNumber] =>
[RequestedInventoryFilterMethod] => 0
[RequestedPromotionalCode] =>
[RequestedReservationChannel] => 0
[SegmentDetails] => stdClass Object
(
)
[TaxDetails] => stdClass Object
(
)
)
)
如有任何帮助或提示,我们将不胜感激!谢谢!
自己想通了并决定分享:
$info = new StdClass;
$info->Origin = "BRL";
$info->Destination = "ORD";
$info->UseAirportsNotMetroGroups = false;
$info->UseAirportsNotMetroGroupsAsRule = false;
$info->UseAirportsNotMetroGroupsForForm = false;
$info->UseAirportsNotMetroGroupsForTo = false;
$info->DateOfDeparture = "2016-11-20";
$info->FareTypeCategory = 1;
$info->FareClass = null;
$info->FareBasisCode = null;
$info->Cabin = null;
$info->LFID = -214;
$info->OperatingCarrierCode = null;
$info->MarketingCarrierCode = null;
$info->NumberOfDaysBefore = 0;
$info->NumberOfDaysAfter = 0;
$info->LanguageCode = "en";
$info->TicketPackageID = 1;
$info->FareQuoteRequestInfos->FareQuoteRequestInfo[] = array(
'PassengerTypeID' => 1,
'TotalSeatsRequired' => 1
);
$info->FareQuoteRequestInfos->FareQuoteRequestInfo[] = array(
'PassengerTypeID' => 5,
'TotalSeatsRequired' => 1
);
$info->FareQuoteRequestInfos->FareQuoteRequestInfo[] = array(
'PassengerTypeID' => 6,
'TotalSeatsRequired' => 1
);
$detail = new StdClass;
$detail->FareQuoteDetail = $info;
$data->CurrencyOfFareQuote = "USD";
$data->CorporationID = -214;
$data->FareFilterMethod = "NoCombinabilityRoundtripLowestFarePerFareType";
$data->FareGroupMethod = "WebFareTypes";
$data->InventoryFilterMethod = "Available";
$data->ClientIPAddress = "?"; // Optional
$data->HistoricUserName = "?"; // Optional
$data->PromotionalCode = null;
$data->IataNumberOfRequestor = null;
$data->FareQuoteDetails = $detail;
$quote = $pricing->RetrieveFareQuote(array("RetrieveFareQuoteRequest" => $data));
print_r($quote);
我将 FareQuoteDetail 移动到一个单独的 class 对象中,然后将每个 FareQuoteRequestInfo 添加为一个数组,这样我就可以保持相同的命名结构。