Comment utiliser request ou le module http pour lire la page gzip dans une chaîne

J’ai trouvé que le module de requête en js ne peut pas gérer correctement la réponse http au format gzip ou gonfler.

par exemple:

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

Je souhaite donc utiliser l’exemple de code dans la documentation officielle.

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

Le problème est que le code écrit la page Web dans un fichier, j’espère qu’il peut écrire la page dans une chaîne, de sorte que je puisse traiter la page. Je ne pouvais trouver aucune classe comme ‘SsortingngStream’.

Si quelqu’un a une idée à ce sujet, ce sera génial.

    Dirigez la réponse vers le stream gzip et utilisez-la comme vous utiliseriez l’object de réponse d’origine.

     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.toSsortingng('utf-8'); body += data; }); output.on('end', function() { return next(false, body); }); }); req.on('error', function(err) { next(err); }) 

    exemple simplifié:

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

    J’ai rencontré un problème similaire et je voulais continuer à utiliser la bibliothèque de request au lieu du module http intégré. J’ai discuté de deux approches de travail ici: http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression . L’une d’elles est similaire à la réponse de @ Teemu, tandis que l’autre utilise des stream.

    Le module de requête gère les réponses gzip. Tout ce que nous avons à faire est de définir l’atsortingbut ‘gzip’ dans les options. Pour une explication détaillée s’il vous plaît visitez le linke ci-dessous. Là j’ai clairement expliqué avec exemple.

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

    Les réponses de @Dawid et @Teemu freinent parfois les caractères de la réponse en cas de codage utf-8. Ce code fonctionne beaucoup mieux:

     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.toSsortingng()); }); }); }); }