从NodeJS中的PHP服务器解压缩GZIP字符串响应

时间:2019-03-04 06:52:16

标签: javascript node.js gzip

我有一个现有的PHP代码,正在对第三方PHP服务器进行curl请求。

第三方服务器返回GZIP字符串。

在PHP中,我可以使用gzdecode来解码gzip字符串。

如何在NodeJS / Javascript中做到这一点?我尝试使用decompress-response无济于事。

也尝试使用got代替request,启用自动解压缩,也无效。

编辑:也尝试过zlibpako,也无效。

示例代码[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 :(得分:0)

这是对我有用的解决方案。

我使用got代替了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