如何强制Node的请求模块不对响应进行编码?

时间:2013-01-30 05:10:57

标签: javascript node.js

我正在使用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?
}); 

2 个答案:

答案 0 :(得分:2)

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

var zlib = require('zlib');

// Other code

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

这方面的主要缺点是,这会强制request模块将整个响应内容处理为Buffer body。相反,您通常应该使用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
});

答案 1 :(得分:0)

首先设置accept:identity作为标题。如果堆叠更改不会将数据作为常规UTF8发送,那么这就是他们最终的错误。

其次,您希望将编码设置为UTF8,以便响应不是缓冲区。

相关问题