Как получить контент, закодированный gzip, из PHP API apitude hotelbeds

Недавно я начал работать с APITUDE PHP API.

Я пытаюсь отправить запрос и получить ответ через https://pecl.php.net/package/pecl_http

Теперь я столкнулся с некоторыми проблемами с получением данных кодирования gzip через API. Вот конечная точка и заголовки информация

Я пытаюсь использовать следующий код -

$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());

                }

Я получаю код ответа 200, когда делаю запрос API. Все, с чем я столкнулся, - это проблема с получением данных из тела ответа. На выходе я вижу следующие закодированные данные -

{}���C���

Как я могу получить данные, закодированные gzip, как тело содержимого запроса?


person user3384985    schedule 02.08.2016    source источник


Ответы (2)


Я не знаком с 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);
person BeetleJuice    schedule 02.08.2016

Вы вручную устанавливаете заголовок «Accept-Encoding: gzip», поэтому ваш ответ, вероятно, закодирован gzip, и, таким образом, бывший автор прав.

Избегайте этого, удалив явный заголовок и сказав клиенту передать содержимое, закодированное gzip, с помощью $client->setOptions(["compress" => true]);.

person m6w6    schedule 07.09.2016