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!
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
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.
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
Consultez les exemples sur http://nodejs.org/docs/v0.6.0/api/zlib.html#examples
zlib est maintenant intégré au nœud.
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) { ... }
);