我正试图找出最简便的方法来发送HTTP/HTTPS请求并处理gzip/deflate压缩响应以及cookie。
我发现最好的方法是使用https://github.com/mikeal/request,它可以处理所有事情,除了压缩。是否有一个模块或方法可以满足我的所有需求?
如果没有,我能否将request和zlib结合起来呢?我尝试过将zlib和http.ServerRequest
结合起来,但失败了。
我正试图找出最简便的方法来发送HTTP/HTTPS请求并处理gzip/deflate压缩响应以及cookie。
我发现最好的方法是使用https://github.com/mikeal/request,它可以处理所有事情,除了压缩。是否有一个模块或方法可以满足我的所有需求?
如果没有,我能否将request和zlib结合起来呢?我尝试过将zlib和http.ServerRequest
结合起来,但失败了。
如果最近有人遇到这个问题,请求库现在已经原生支持 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 readme https://github.com/request/request
gzip - 如果为true,则向请求添加Accept-Encoding标头以从服务器请求压缩的内容编码(如果尚未存在),并在响应中解码支持的内容编码。注意:响应内容的自动解码是在request返回的数据体上执行的(通过请求流和传递给回调函数),但不会在响应流上执行(可从响应事件获取)该流是未修改的http.IncomingMessage对象,可能包含压缩数据。请参见下面的示例。
注意:截至2019年,请求(request)已内置gzip解压缩功能。您仍然可以使用以下方法手动解压缩请求。
您可以简单地将request
和zlib
与流(streams)结合使用。
这是一个示例,假设您有一个在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
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);
}
请查看http://nodejs.org/docs/v0.6.0/api/zlib.html#examples上的示例。
zlib现在已经内置于node中。
查看 源代码 可知:要启用 gzip,你必须在请求库本身上设置 gzip
参数。不确定这是否是有意为之,但这是当前的实现方式。无需额外的 headers。
var request = require('request');
request.gzip = true;
request({url: 'https://...'}, // use encoding:null for buffer instead of UTF8
function(error, response, body) { ... }
);
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);