6

我这辈子都想不通。下面是请求模块的实现,但我也尝试使用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 对象)并且它可以正常工作。我究竟做错了什么?

4

2 回答 2

11

内容已压缩。您可以使用request和解zlib压缩来自 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

进一步阅读使用 gzip/deflate 压缩的简单 HTTP 请求

于 2013-02-10T01:20:55.757 回答
6

虽然 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
});
于 2016-12-06T07:17:37.180 回答