我有一个现有的PHP代码,正在对第三方PHP服务器进行curl请求。
第三方服务器返回GZIP字符串。
在PHP中,我可以使用gzdecode
来解码gzip字符串。
如何在NodeJS / Javascript中做到这一点?我尝试使用decompress-response无济于事。
也尝试使用got代替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;
}
答案 0 :(得分:0)
这是对我有用的解决方案。
我设置了我的请求选项:
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
。