如何从hotelbeds apitude PHP API获取gzip编码内容

时间:2016-08-02 05:16:17

标签: php gzip pecl

最近,我开始使用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编码数据作为请求内容体?

2 个答案:

答案 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编码的内容。