CURL将XML数据发送到soap服务返回wsdl在php中的XML
问题描述:
我想使用curl请求获取响应。肥皂服务运行良好,肥皂客户端。但使用卷曲我没有得到适当的回应。CURL将XML数据发送到soap服务返回wsdl在php中的XML
这是我的代码示例:
$bookingRQ = '<?xml version="1.0" encoding="UTF-8"?>
<soap-env:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header>
<Interface xmlns="http://api.hotels-vacation.com/Documentation/XML/OTA/4/2011B/" ChannelIdentifierId="HIS_VACATION_XML4H" Version="2011B" Interface="VACATION QUICK CONNECT XML 4 OTA">
<ComponentInfo User="XMLHISJP" Pwd="5Kh86RSr" ComponentType="Hotel" />
</Interface>
</soap-env:Header>
<soap-env:Body RequestId="201505101528000000001" Transaction="OTA_HotelResRQ">
<OTA_HotelResRQ xmlns="http://www.opentravel.org/OTA/2003/05" TimeStamp="2012-05-03T15:47:24-04:00" EchoToken="2012-05-03T15:47:24-04:00" Target="Production" Version="1.000" PrimaryLangID="en">
<HotelReservations>
<HotelReservation RoomStayReservation="true" CreateDateTime="2012-05-03T15:47:24-04:00">
<UniqueID Type="14" ID="HZ10014035" />
<RoomStays>
<RoomStay>
<RoomTypes>
<RoomType RoomTypeCode="RR" />
</RoomTypes>
<RatePlans>
<RatePlan RatePlanCode="RPLN">
<MealsIncluded MealPlanCodes="BRE" />
</RatePlan>
</RatePlans>
<RoomRates>
<RoomRate NumberOfUnits="1" EffectiveDate="2012-05-13" ExpireDate="2012-05-16" RoomTypeCode="RR" RatePlanCode="RPLN">
<Rates>
<Rate EffectiveDate="2012-05-13" ExpireDate="2012-05-14" RateTimeUnit="Day">
<Base AmountBeforeTax="10000" AmountAfterTax="10980" DecimalPlaces="2" CurrencyCode="USD" />
<Total AmountBeforeTax="10000" AmountAfterTax="10980" DecimalPlaces="2" CurrencyCode="USD" />
</Rate>
<Rate EffectiveDate="2012-05-14" ExpireDate="2012-05-16" RateTimeUnit="Day">
<Base AmountBeforeTax="12000" AmountAfterTax="13050" DecimalPlaces="2" CurrencyCode="USD" />
<Total AmountBeforeTax="24000" AmountAfterTax="26100" DecimalPlaces="2" CurrencyCode="USD" />
</Rate>
</Rates>
</RoomRate>
</RoomRates>
<GuestCounts>
<GuestCount AgeQualifyingCode="10" Count="1" />
<GuestCount AgeQualifyingCode="8" Count="1" />
</GuestCounts>
<TimeSpan Start="2012-05-13" End="2012-05-16" />
<DepositPayments>
<RequiredPayment>
<AcceptedPayments>
<AcceptedPayment RPH="1">
<PaymentCard CardType="1" CardCode="VISA" CardNumber="4321432143214327" ExpireDate="1007" />
</AcceptedPayment>
</AcceptedPayments>
<AmountPercent Amount="130.80" />
<Deadline AbsoluteDeadline="2012-12-15" />
</RequiredPayment>
</DepositPayments>
<BasicPropertyInfo HotelCode="105487" />
<ResGuestRPHs>
<ResGuestRPH RPH="1" />
<ResGuestRPH RPH="2" />
</ResGuestRPHs>
<SpecialRequests>
<SpecialRequest Language="en" RequestCode="114">
<Text Language="en">Honeymoon</Text>
</SpecialRequest>
<SpecialRequest Language="en" RequestCode="21">
<Text Language="en">Non-Smoking</Text>
</SpecialRequest>
</SpecialRequests>
</RoomStay>
</RoomStays>
<ResGuests>
<ResGuest ResGuestRPH="1" AgeQualifyingCode="10" Age="21">
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
<PersonName>
<GivenName>John</GivenName>
<Surname>Dow</Surname>
</PersonName>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGuest>
<ResGuest ResGuestRPH="2" AgeQualifyingCode="8" age="10">
<Profiles>
<ProfileInfo>
<Profile ProfileType="1">
<Customer>
<PersonName>
<GivenName>Neil</GivenName>
<Surname>Dow</Surname>
</PersonName>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGuest>
</ResGuests>
</HotelReservation>
</HotelReservations>
</OTA_HotelResRQ>
</soap-env:Body>
</soap-env:Envelope>';
$headers = array(
"Cache-Control: no-cache",
"Content-type: text/xml; charset=\"utf-8\"",
"Accept: text/xml",
"SOAPAction: \"OTA_HotelResRQ\"",
"Pragma: no-cache",
"Content-length: ".strlen($bookingRQ)
);
$url = 'http://chetu.volateam.com/chetu/push/soapserver/PullService.php?wsdl';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $bookingRQ);
$result = curl_exec($ch);
$xmlstring = str_replace('soap-env:', '', $result);
$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
我得到的WSDL XML代码作为响应。我谷歌,但我没有找到任何解决方案。我得到如下所述的响应数组。
阵列 ( [@属性] =>数组 ( [名称] => PullServiceHIS [的targetNamespace] =>http://chetu.volateam.com/chetu/push/soapserver/PullService.php )
[types] => Array
(
)
[portType] => Array
(
[@attributes] => Array
(
[name] => PullServiceHISPort
)
[operation] => Array
(
[@attributes] => Array
(
[name] => OTA_HotelResRQ
)
[documentation] => This method takes XML request and return a string response
[input] => Array
(
[@attributes] => Array
(
[message] => tns:OTA_HotelResRQIn
)
)
[output] => Array
(
[@attributes] => Array
(
[message] => tns:OTA_HotelResRQOut
)
)
)
)
[binding] => Array
(
[@attributes] => Array
(
[name] => PullServiceHISBinding
[type] => tns:PullServiceHISPort
)
[operation] => Array
(
[@attributes] => Array
(
[name] => OTA_HotelResRQ
)
[input] => Array
(
)
[output] => Array
(
)
)
)
[service] => Array
(
[@attributes] => Array
(
[name] => PullServiceHISService
)
[port] => Array
(
[@attributes] => Array
(
[name] => PullServiceHISPort
[binding] => tns:PullServiceHISBinding
)
)
)
[message] => Array
(
[0] => Array
(
[@attributes] => Array
(
[name] => OTA_HotelResRQIn
)
[0] => Array
(
[@attributes] => Array
(
[name] => bookingRQ
[type] => xsd:string
)
)
)
[1] => Array
(
[@attributes] => Array
(
[name] => OTA_HotelResRQOut
)
[part] => Array
(
[@attributes] => Array
(
[name] => return
[type] => xsd:string
)
)
)
)
)
答
我劝你使用Native PHP SoapClient类。最简单的方法就是使用一个WSDL to PHP生成器,它将帮助您将要发送的结构建模为请求。
您还必须知道,OTA调用起来可能很复杂,并且需要对rquest结构有很好的理解。