Я использую Node's 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
user1968988 30 Янв 2013 в 09:10

2 ответа

Лучший ответ

Кодировка не имеет ничего общего с request. API StackOverflow всегда возвращает данные в кодировке GZip, как описано в документации API. Вам нужно использовать модуль 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
});
2
loganfsmyth 30 Янв 2013 в 06:14

Первый набор принять: идентичность в качестве заголовка. Если сгруппированные изменения не отправляют данные как обычный UTF8, то это ошибка на их конце.

Во-вторых, вы хотите установить кодировку UTF8, чтобы ответ не был буфером.

0
Jonathan Ong 30 Янв 2013 в 08:15