Requête HTTP POST avec encodage Gzip en NodeJS

nodejs gzip

Les modules http et https de NodeJS permettent d’effectuer facilement de nombreuses opérations liées au protocol HTTP et HTTPS: GET, POST, PUT, DELETE, …

Il est donc possible de poster des données en HTTP POST afin de remplir un formulaire HTML ou bien pour envoyer des informations à un serveur Web.

Mais lorsque l’on souhaite envoyer des données en grande quantité, il est utile de les gzipper.

Grâce au header “Content-Encoding” du protocol HTTP, on peut donc envoyer les données encodées au format gzip, ce qui permet d’économiser de la bande passante.

Il faut tout de même noter 2 points:

  • l’encodage gzip ne peut pas être considérer comme du cryptage car il ne fait que compresser les données.
  • l’encodage des données au niveau du client et le décodage au niveau du serveur peut consommer de la CPU et mémoire.

Pour pouvoir effectuer un HTTP POST avec encodage Gzip en NodeJS, nous allons combiner le module http avec le module zlib, ce qui donnera le code suivant:

var http = require('http');
var zlib = require('zlib');
 
//Données à envoyer
var data = JSON.stringify({
"name": "test"
});
 
var req = http.request({
"host": "http://127.0.0.1",
"port": 80,
"method": "POST",
"path": "/path",
"headers": {
"Content-Encoding": "gzip",
"Content-Type": "application/json; charset=UTF-8",
},
}, function(res) {
var body = "";
res.on("data", function(chunk) {
body += chunk;
});
res.on("end", function() {
if (res.statusCode !== 200) {
console.error("Bad status code received: " + res.statusCode);
} else {
console.log("Posting OK");
}
});
});
 
req.on("error", function(e) {
console.error("Error posting data: " + e.message);
});
 
zlib.gzip(data, function(error, result) {
req.write(result);
req.end();
});

Encore une fois le code est relativement simple et effectuer une requête HTTP POST avec encodage Gzip en NodeJS s’avère être un véritable jeu d’enfant. C’est qu’on commencerait presque à aimer le développement en NodeJS !!!

Leave a Reply

Your email address will not be published. Required fields are marked *