Распакуйте строковый ответ GZIP с сервера PHP в NodeJS - PullRequest
0 голосов
/ 04 марта 2019

У меня есть существующий код PHP, который выполняет запрос curl на сторонний сервер PHP.

Сторонний сервер возвращает строку GZIP.

В PHP я могу использовать gzdecode для декодирования строки gzip.

Как это сделать в NodeJS/ Javascript?Я пытался использовать декомпресс-ответ безрезультатно.

Также пытался использовать полученный вместо request, включенная автоматическая декомпрессия, также не работает.

Редактировать: также пробовал zlib и pako, также не работает.

Пример кода [PHP]

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => $params,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 3000000,
    CURLOPT_ENCODING  => '',
    CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);
if ($err) {
   echo false;
} else {
   $response = gzdecode($response);
   echo $response;
}

1 Ответ

0 голосов
/ 04 марта 2019

Это решение, которое работает для меня.

Я использовал получил вместо axios , потому что я не могузаставить его работать там.

Я установил параметры моего запроса:

const requestOptions = {
    encoding: null, // this is important
    headers: {
        "Accept-Encoding": "gzip",
    }
    ...
};

Не забудьте эту строку encoding: null, потому что без этого ответ будет автоматически преобразованв строку.(Нам нужен буфер для этой работы)

Затем я создал такую ​​функцию для обработки моего запроса:

const zlib = require("zlib");

async function performRequest(url, options) {
    try {
        const response = await got(url, options);
        if (response.headers["content-encoding"] === "gzip") {
            const body = response.body;
            try {
                const dezziped = zlib.gunzipSync(response.body);
                response.body = JSON.parse(dezziped.toString());
            } catch (error) {
                response.body = body;
            }
        }
        return response.body;
    } catch (error) {
        return error;
    }
}

Примечание: Это синхронная операциявместо этого вы можете использовать gunzip, если хотите выполнить асинхронный способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...