2013-02-10 10 views
6

Ich kann das nicht für das Leben von mir herausfinden. Unten ist eine Implementierung mit dem request Modul, aber ich habe auch mit dem node-XMLHttpRequest Modul vergeblich versucht.Kodierungsproblem beim Anfordern von JSON von 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 
}); 

Scheint eine Codierung Problem zu sein, aber ich habe genau die gleichen Code (mit nativer XHR-Objekten) im Browser und es funktioniert ohne Probleme. Was mache ich falsch?

Antwort

10

Der Inhalt ist gzipped. Sie können request und zlib verwenden eine gestreamte Antwort von der API zu dekomprimieren:

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 

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

+0

Ja, das macht Sinn. Vielen Dank! –

4

Während pero Antwort richtig ist, gibt es einen einfacheren Weg, dies zu tun.

Da Sie Anfrage verwenden, können Sie auch fügen Sie einfach die gzip: true Flagge:

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