Я использую что-то под названием 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>
Я удалил идентифицирующие коды перевозчика и заменил их на ххх. Код безопасности 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 в отдельный объект класса, а затем добавил каждый FareQuoteRequestInfo в виде массива, что позволило мне сохранить ту же структуру именования.
Других решений пока нет …