我正在使用 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?
});
最佳答案
编码与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
});
关于javascript - 如何强制 Node 的请求模块不对响应进行编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14597125/