HTTP响应的Gzip解压缩

3
使用 request 模块,我正在尝试从一个具有以下 API 请求头的 Web 服务中获取响应:

accept-encoding : gzip

相应地,在响应中有以下标头:

content-encoding : gzip

当我尝试使用 zlib(参考 这里)解压缩响应(获取正确可读的响应)时,我无法做到这一点。
代码片段如下:
var options = {
        url: url,
        qs: params.qparams,
        method: params.method,
        json: params.body,
        headers: {
            'api_key': configkey,
            'Content-Type': 'application/json',
            'Accept-Encoding': 'gzip'
        },
        timeout: constants.request_timeout
    };
request(options, function(err, response, body) {

        var encoding = response.headers['content-encoding']
        if (encoding && encoding.indexOf('gzip') >= 0) {
          zlib.gunzip(body, function(err, dezipped) {
            //ERROR : { [Error: incorrect header check] errno: -3, code: 'Z_DATA_ERROR' }
            var json_string = dezipped.toString('utf-8');
            var json = JSON.parse(json_string);
            console.log('\nJSON ::\n',json);
          });
        } else {
            console.log('\n\nRESPONSE IS NOT GZIPPED!');
        }
}   

我在这里遇到了一个错误(如代码中所注释的),使用了zlib。
我无法弄清楚出了什么问题,尝试了多个npm模块,比如unzipResponsecompress-buffer,并尝试了不同的方法来处理gzip,就像各个地方建议的那样。
如果有人能帮助解决这个问题,我将非常感激。
1个回答

4

我有一个解决方案,需要在选项对象中添加一个键,如下:

var options = {
    url: url,
    qs: params.qparams,
    method: params.method,
    json: params.body,
    headers: {
        'api_key': configkey,
        'Content-Type': 'application/json',
        'Accept-Encoding': 'gzip'
    },
    timeout: constants.request_timeout,
    encoding: null 
};

如果有更好的方法来执行解压缩,请添加。


我之前在使用node-wget时,对于某个特定的URL也遇到了类似的问题。后来我转用了request并采用了你的模式,然后问题就解决了。但我真希望能够明白这里到底发生了什么。 - z0d14c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接