2012-04-18 12 views
13

Ho trovato che il modulo di richiesta in js non è in grado di gestire correttamente la risposta http in formato gzip o inflate.Come utilizzare la richiesta o il modulo http per leggere la pagina gzip in una stringa

ad esempio:

request({url:'some url'}, function (error, response, body) { 
    //if the content-encoding is gzip, the body param here contains binaries other than readable string. And even worse after you convert the body to buffer, u even can not gunzip it. 
} 

quindi voglio utilizzare il codice di esempio nella documentazione ufficiale.

var request = http.get({ host: 'izs.me', 
         path: '/', 
         port: 80, 
         headers: { 'accept-encoding': 'gzip,deflate' } }); 
request.on('response', function(response) { 
    var output = fs.createWriteStream('izs.me_index.html'); 

    switch (response.headers['content-encoding']) { 
    // or, just use zlib.createUnzip() to handle both cases 
    case 'gzip': 
     response.pipe(zlib.createGunzip()).pipe(output); 
     break; 
    case 'deflate': 
     response.pipe(zlib.createInflate()).pipe(output); 
     break; 
    default: 
     response.pipe(output); 
     break; 
    } 
}); 

Il problema è che il codice sta scrivendo la pagina web in un file, spero che possa scrivere la pagina in una stringa, in modo che possa elaborare la pagina. Non ho trovato nessuna classe come "StringStream".

Se qualcuno ha qualche idea su questo, sarà fantastico.

+0

Se createUnzip in grado di gestire sia gzip e gonfiare, perché preoccuparsi di scrivere il codice in più? È più lento? – CMCDragonkai

risposta

18

Convogliare la risposta allo stream gzip e utilizzarla come si utilizza l'oggetto di risposta originale.

var req = http.request(options, function(res) { 
    var body = ""; 

    res.on('error', function(err) { 
     next(err); 
    }); 

    var output; 
    if(res.headers['content-encoding'] == 'gzip') { 
     var gzip = zlib.createGunzip(); 
     res.pipe(gzip); 
     output = gzip; 
    } else { 
     output = res; 
    } 

    output.on('data', function (data) { 
     data = data.toString('utf-8'); 
     body += data; 
    }); 

    output.on('end', function() { 
     return next(false, body); 
    }); 
}); 

req.on('error', function(err) { 
    next(err); 
}) 
+0

e quindi questa risposta è corretta? in tal caso, per favore, assegna la risposta corretta – abbood

+2

Usa quel codice per supportare ** deflate ** anche: 'if (res.headers ['content-encoding'] == 'deflate') {output = zlib.createInflate() ; res.pipe (uscita); } ' –

+0

Si noti che i tasti di intestazione sono in lettere minuscole in http.request di node.js, tuttavia in base alle specifiche non fanno distinzione tra maiuscole e minuscole. Quindi ogni volta che usi un altro modulo di richiesta assicurati che le intestazioni siano in minuscolo o cambino il codice ... – sebilasse

6

esempio semplificato:

var https = require('https'); 
var gunzip = require('zlib').createGunzip(); 

var options = { 
    host: 'api.stackexchange.com', 
    path: '/2.1/info?site=stackoverflow' 
}; 

https.get(options, function(res) { 
    var body = ''; 

    res.pipe(gunzip); 

    gunzip.on('data', function (data) { 
     body += data; 
    }); 

    gunzip.on('end', function() { 
     console.log(JSON.parse(body)); 
    }); 
}); 
1

Le risposte di @Dawid e @Teemu talvolta freno i caratteri della risposta in caso di codifica UTF-8. Questo codice funziona molto meglio:

function getGzipped(url, cb) { 
    // downloads gzipped file 
    http.get(url, function(res) { 

     let chunks = []; 

     res.on('data', function(chunk) { 
      chunks.push(chunk); 
     }); 
     res.on('end', function() { 
      let buffer = Buffer.concat(chunks); 
      zlib.gunzip(buffer, function(err, decoded) { 
       if (err) throw err; 
       cb(decoded && decoded.toString()); 
      }); 
     }); 
    }); 
} 
3

modulo di richiesta gestisce le risposte gzip. Tutto quello che dobbiamo fare è impostare l'attributo 'gzip' negli opts. Per una spiegazione dettagliata si prega di visitare il sotto linke. Lì ho chiaramente spiegato con l'esempio.

https://stackoverflow.com/a/38582506/5878471

Problemi correlati