如何在 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 添加为一个数组,这样我就可以保持相同的命名结构。