web-dev-qa-db-fra.com

node.js - requêtes http simples avec compression gzip / deflate

J'essaie de comprendre comment la meilleure façon d'envoyer facilement des demandes HTTP/HTTPS et de gérer les réponses compressées gzip/dégonflées avec les cookies.

Le meilleur que j'ai trouvé était https://github.com/mikeal/request qui gère tout sauf la compression. Existe-t-il un module ou une méthode qui fera tout ce que je demande?

Sinon, puis-je combiner request et zlib d'une manière ou d'une autre? J'ai essayé de combiner zlib et http.ServerRequest, et cela a lamentablement échoué.

Merci!

45
wridgers

Remarque: à partir de 2019, la décompression gzip est intégrée à la demande. Vous pouvez toujours décompresser les demandes manuellement en utilisant la méthode ci-dessous.

Vous pouvez simplement combiner request et zlib avec des flux.

Voici un exemple en supposant qu'un serveur écoute sur le port 8000:

var request = require('request'), zlib = require('zlib');

var headers = {
    'Accept-Encoding': 'gzip'
};

request({url:'http://localhost:8000/', 'headers': headers})
    .pipe(zlib.createGunzip()) // unzip
    .pipe(process.stdout); // do whatever you want with the stream
70
jcreignou

Pour toute personne rencontrant ces problèmes ces derniers temps, la bibliothèque de requêtes prend désormais en charge la décompression gzip. Utilisez comme suit:

request(
    { method: 'GET'
    , uri: 'http://www.google.com'
    , gzip: true
    }
  , function (error, response, body) {
      // body is the decompressed response body
      console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
      console.log('the decoded data is: ' + body)
    }
  )

Depuis le readme de github https://github.com/request/request

gzip - Si vrai, ajoutez un en-tête Accept-Encoding pour demander des encodages de contenu compressé au serveur (s'il n'est pas déjà présent) et décodez les encodages de contenu pris en charge dans la réponse. Remarque: Le décodage automatique du contenu de la réponse est effectué sur les données de corps renvoyées via la demande (à la fois via le flux de demande et transmises à la fonction de rappel) mais n'est pas effectuée sur le flux de réponse (disponible à partir de l'événement de réponse) qui est le http non modifié Objet .IncomingMessage pouvant contenir des données compressées. Voir l'exemple ci-dessous.

92
Ryan Knell

Voici un exemple de travail qui tire la réponse

function gunzipJSON(response){

    var gunzip = zlib.createGunzip();
    var json = "";

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

    gunzip.on('end', function(){
        parseJSON(json);
    });

    response.pipe(gunzip);
}

Code complet: https://Gist.github.com/0xPr0xy/5002984

6
user764155

Consultez les exemples sur http://nodejs.org/docs/v0.6.0/api/zlib.html#examples

zlib est maintenant intégré au nœud.

3
Dick Hardt

En regardant à l'intérieur du code source - vous devez définir le paramètre gzip sur la bibliothèque de requêtes elle-même pour que gzip fonctionne. Je ne sais pas si c'était intentionnel ou non, mais c'est la mise en œuvre actuelle. Aucun en-tête supplémentaire n'est nécessaire.

var request = require('request');
request.gzip = true;
request({url: 'https://...'},  // use encoding:null for buffer instead of UTF8
    function(error, response, body) { ... }
);
1
Yurik