我正在使用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?
});
答案 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,以便响应不是缓冲区。