0

我正在使用 Node 的request模块。
我得到的响应是“gziped”或以其他方式编码的。

我该如何
1. 构建请求以不对响应进行编码?
2. 解码响应?
数据来自http://api.stackexchange.com

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

var stackRequest = require('request'); 
var apikey = '<MyKey>';
var fromdate = '1359417601';
var tagged = 'node.js';
stackRequest(
    { method: 'GET'
        , uri: 'http://api.stackexchange.com/2.1/questions?key=' + apikey + 
          '&site=stackoverflow&fromdate=' + fromdate + '&order=desc&' + 
          'sort=activity&tagged=' + tagged + '&filter=default'
}, function(err, response, body) { 
    console.log(response.body); // How can I decode this?
}); 
4

2 回答 2

2

编码与 . 无关request。StackOverflow 的 API 始终返回 GZip 编码数据,如API 文档中所述。您需要使用 Node 的zlib模块来解压缩内容。这是一个简单的例子:

var zlib = require('zlib');

// Other code

, function(err, response, body) {
   zlip.gunzip(body, function(err, data){
     console.log(data);
  });
});

这样做的主要缺点是,这会迫使request模块将整个响应内容处理Bufferbody. 相反,您通常应该使用 Node 的Stream系统将请求中的数据直接通过解压缩库发送,这样您就可以使用更少的内存。您仍然需要将这些部分连接在一起以解析 JSON,但它仍然更好。

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

var apikey = '<MyKey>';
var fromdate = '1359417601';
var tagged = 'node.js';
var compressedStream = request('http://api.stackexchange.com/2.1/questions?' +
    'key=' + apikey + '&site=stackoverflow&fromdate=' + fromdate +
    '&order=desc&sort=activity&tagged=' + tagged + '&filter=default');

var decompressedStream = compressedStream.pipe(zlib.createGunzip());

var chunks = [];
decompressedStream.on('data', function(chunk){
  chunks.push(chunk);
});
decompressedStream.on('end', function(){
    var body = Buffer.concat(chunks);

    var data = JSON.parse(body);

    // Do your thing
});
于 2013-01-30T06:04:58.173 回答
0

第一组接受:身份作为标头。如果堆栈更改不以常规 UTF8 格式发送数据,那么这就是他们的错误。

其次,您要将编码设置为 UTF8,因此响应不是缓冲区。

于 2013-01-30T08:15:11.627 回答