54

我试图找出轻松发送 HTTP/HTTPS 请求和处理 gzip/deflate 压缩响应以及 cookie 的最佳方法。

我发现最好的是https://github.com/mikeal/request,它可以处理压缩之外的所有内容。是否有一个模块或方法可以满足我的要求?

如果没有,我可以以某种方式结合 request 和 zlib 吗?我试图将 zlib 和 结合起来http.ServerRequest,但它失败了。

4

6 回答 6

112

对于最近遇到此问题的任何人,请求库现在支持开箱即用的 gzip 解压缩。使用如下:

request(
    { method: 'GET'
    , uri: 'http://www.google.com'
    , gzip: true
    }
  , function (error, response, body) {
      // body is the decompressed response body
      console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
      console.log('the decoded data is: ' + body)
    }
  )

来自 github 自述文件https://github.com/request/request

gzip - 如果为 true,则添加 Accept-Encoding 标头以从服务器请求压缩的内容编码(如果尚不存在)并在响应中解码支持的内容编码。注意:响应内容的自动解码是对请求返回的主体数据(通过请求流和传递给回调函数)进行的,而不是对未修改的http的响应流(可从响应事件获得)执行.IncomingMessage 对象,其中可能包含压缩数据。请参见下面的示例。

于 2015-02-18T12:07:38.007 回答
82

注意:从 2019 年开始,request 内置了 gzip 解压。您仍然可以使用以下方法手动解压请求。

您可以简单地将requestzlib与流结合起来。

这是一个示例,假设您有一个服务器在端口 8000 上侦听:

var request = require('request'), zlib = require('zlib');

var headers = {
    'Accept-Encoding': 'gzip'
};

request({url:'http://localhost:8000/', 'headers': headers})
    .pipe(zlib.createGunzip()) // unzip
    .pipe(process.stdout); // do whatever you want with the stream
于 2013-02-06T21:47:29.117 回答
9

这是一个可以压缩响应的工作示例

function gunzipJSON(response){

    var gunzip = zlib.createGunzip();
    var json = "";

    gunzip.on('data', function(data){
        json += data.toString();
    });

    gunzip.on('end', function(){
        parseJSON(json);
    });

    response.pipe(gunzip);
}

完整代码:https ://gist.github.com/0xPr0xy/5002984

于 2013-02-21T07:53:15.510 回答
5

查看http://nodejs.org/docs/v0.6.0/api/zlib.html#examples上的示例

zlib 现在已内置到节点中。

于 2012-02-18T00:35:54.903 回答
3

查看源代码- 您必须gzip在请求库本身上设置参数才能使 gzip 工作。不确定这是否是故意的,但这是当前的实现。不需要额外的标题。

var request = require('request');
request.gzip = true;
request({url: 'https://...'},  // use encoding:null for buffer instead of UTF8
    function(error, response, body) { ... }
);
于 2015-05-28T00:55:42.707 回答
2

这里的所有答案都不起作用,我取而代之的是原始字节,并且gzip标志也不起作用。事实证明,您需要将编码设置null为防止请求将响应转换为 utf-8 编码,而是保留二进制响应。

const request = require("request-promise-native");
const zlib = require("zlib");

const url = getURL("index.txt");
const dataByteBuffer = await request(url, { encoding: null });
const dataString = zlib.gunzipSync(response);
于 2019-11-24T04:51:14.450 回答