最近,我开始使用Hotelbeds APITUDE PHP API
我正在尝试发送请求并通过pecl_http
获得回复现在我遇到了通过API获取gzip编码数据的一些问题。以下是端点和标头information
我正在尝试使用以下代码 -
$xml_part = <<< EOD
<availabilityRQ xmlns="http://www.hotelbeds.com/schemas/messages" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" dailyRate="true">
<stay checkIn="2016-09-15" checkOut="2016-09-16"/>
<occupancies>
<occupancy rooms="1" adults="2" children="0">
<paxes>
<pax type="AD"/>
<pax type="AD"/>
</paxes>
</occupancy>
</occupancies>
<hotels>
<hotel>1067</hotel>
<hotel>1070</hotel>
</hotels>
<keywords>
<keyword>34</keyword>
<keyword>38</keyword>
<keyword>100</keyword>
</keywords>
<boards included="true">
<board>RO</board>
<board>BB</board>
</boards>
<rooms included="TRUE">
<room>DBT.ST</room>
</rooms>
<accommodations>
<accommodation>HOTEL</accommodation>
<accommodation>HOSTEL</accommodation>
</accommodations>
<reviews>
<review type="TRIPADVISOR" maxRate="5" minReviewCount="3"/>
</reviews>
<filter minRate="100.000" maxRate="170.000"/>
<filter minCategory="3" maxCategory="5"/>
<filter paymentType="AT_HOTEL"/>
<filter maxRatesPerRoom="3"/>
<filter packaging="TRUE"/>
<filter hotelPackage="YES"/>
<filter maxRooms="2"/>
</availabilityRQ> EOD;
$endpoint = "https://api.test.hotelbeds.com/hotel-api/1.0/hotels";
$body = new http\Message\Body();
$body->append($xml_part);
$request = new http\Client\Request("POST",
$endpoint,
["Api-Key" => $hotel_beds_config['api_key'],
"X-Signature" => $signature,
"Content-Type" => "application/xml",
"Accept" => "application/xml",
"Accept-encoding" => "Gzip"
],
$body
);
try {
$client = new http\Client;
$client->enqueue($request)->send();
$response = $client->getResponse();
if ($response->getResponseCode() != 200) {
printf($response->getBody());
} else {
echo '<pre>';
printf(json_encode($response->getBody()));
echo gzencode(json_encode($response->getBody()));
echo '</pre>';
}
} catch (Exception $ex) {
printf("Error while sending request, reason: %s\n", $ex->getMessage());
}
在发出API请求时,我得到200个响应代码。所有我都面临从响应主体检索数据的问题。在输出中,我看到跟随编码数据 -
{}℃
如何将gzip编码数据作为请求内容体?
答案 0 :(得分:0)
我不熟悉pecl_http
,但我发现您的代码有两个问题:
1。这一行:
</availabilityRQ> EOD;
应替换为
</availabilityRQ>
EOD;
结束分隔符EOD;
必须在一条线上;没有其他角色,在它之前或之后都不允许有空格。
2。如果你得到的回复是正确的gzip编码,那么这些行没有多大意义:
printf(json_encode($response->getBody()));
echo gzencode(json_encode($response->getBody()));
你永远不会尝试解码响应;事实上,你正试图json_encode
它!尝试改为
$gz_encoded = $response->getBody();
$gz_decoded = gzdecode($gz_encoded);
现在您可以检查结果了。如果它是一个JSON字符串,您可以解码它:
$final_str = json_decode($gz_decoded);
答案 1 :(得分:0)
您手动设置&#34; Accept-Encoding:gzip&#34;标题,所以您的回复可能是gzip编码,因此前海报是正确的。
通过删除显式标头避免这种情况,并告诉客户端使用$client->setOptions(["compress" => true]);
处理gzip编码的内容。