编码与从StackOverflow API请求JSON的问题

我无法弄清楚我的生活。 下面是一个请求模块的实现,但我也尝试过使用node-XMLHttpRequest模块无济于事。

var request = require('request'); var url = 'http://api.stackexchange.com/2.1/questions?pagesize=100&fromdate=1356998400&todate=1359676800&order=desc&min=0&sort=votes&tagged=javascript&site=stackoverflow'; request.get({ url: url }, function(error, response, body) { if (error || response.statusCode !== 200) { console.log('There was a problem with the request'); return; } console.log(body); // outputs gibberish characters like   console.log(body.toString()); // also outputs gibberish }); 

似乎是一个编码问题,但我已经在浏览器中使用完全相同的代码(与原生XHR对象),它没有任何问题。 我究竟做错了什么?

内容是gzipped 。 您可以使用requestzlib来解压缩来自API的stream式响应:

 var request = require('request') ,zlib = require('zlib'); var url = 'http://api.stackexchange.com/2.1/questions?pagesize=100&fromdate=1356998400&todate=1359676800&order=desc&min=0&sort=votes&tagged=javascript&site=stackoverflow'; request({ url: url, headers: {'accept-encoding': 'gzip'}}) .pipe(zlib.createGunzip()) .pipe(process.stdout); // not gibberish 

(参考: https : //stackoverflow.com/a/14739453/112196 )

虽然pero的答案是正确的,但有一个更简单的方法来做到这一点。

既然你正在使用请求,你也可以添加gzip: true标志:

 var request = require('request'); var url = 'http://api.stackexchange.com/2.1/questions?pagesize=100&fromdate=1356998400&todate=1359676800&order=desc&min=0&sort=votes&tagged=javascript&site=stackoverflow'; request.get({ url: url, headers: {'accept-encoding': 'gzip'}, gzip: true }, function(error, response, body) { console.log(body); // not gibberish });