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

问题描述 投票:0回答:1

我有一个现有的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;
}
javascript node.js gzip
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.