2013-02-10 19 views
6

Non riesco a capirlo per la vita di me. Di seguito è una implementazione con il modulo request, ma ho anche provato con il modulo node-XMLHttpRequest senza alcun risultato.Problema di codifica con la richiesta di JSON da StackOverflow API

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 
}); 

sembra essere un problema di codifica, ma ho usato lo stesso codice esatto (con oggetti XHR nativi) nel browser e funziona senza problemi. Che cosa sto facendo di sbagliato?

risposta

10

Il contenuto è gzipped. È possibile utilizzare request e zlib per decomprimere una risposta in streaming dal 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 

(Riferimento: https://stackoverflow.com/a/14739453/112196)

+0

Sì, questo ha un senso. Grazie! –

4

Mentre la risposta di Pero è corretta, c'è un modo più semplice per fare questo.

Dal momento che si sta utilizzando richiesta, si può anche solo aggiungere il flag 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 
});