2013-02-10 74 views
6

我无法弄清楚这是否适合我的生活。以下是request模块的实现,但我也尝试使用node-XMLHttpRequest模块无济于事。从StackOverflow API请求JSON时的编码问题

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对象)和它的作品没有任何问题。我究竟做错了什么?

回答

10

内容是gzipped。您可以使用requestzlib解压缩从API流式响应:

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

+0

是的,这是有道理的。谢谢! – 2013-02-10 01:46:33

4

虽然佩罗的答案是正确的,有做这个简单的方法。

由于您使用的要求,也可以只是添加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 
});