0x01. Tentang
Saat menulis HTTP, kode kacau muncul saat menerima permintaan HTTP. Kemudian, saya menemukan bahwa GZIP tidak didekompresi.
Mengenai kompresi GZIP/mengempis, ada metode untuk memasukkan kompresi pipa dan kompresi non-pipa.
0x02.Pipe kompresi
I/O di Node tidak sinkron, jadi membaca dan menulis ke disk dan jaringan memerlukan membaca dan menulis ke data melalui fungsi callback.
Ketika data yang perlu diproses tidak dapat dimuat dalam memori pada satu waktu, atau ketika pemrosesan lebih efisien saat membaca, kita perlu menggunakan aliran data.
NodeJS menyediakan operasi pada aliran data melalui berbagai aliran.
Situs web resmi menyediakan metode pipa:
Salinan kode adalah sebagai berikut:
// contoh permintaan klien
var zlib = membutuhkan ('zlib');
var http = membutuhkan ('http');
var fs = membutuhkan ('fs');
var request = http.get ({host: 'homeway.me',
jalur: '/',
Port: 80,
header: {'accept-encoding': 'gzip, deflate'}});
request.on ('response', function (response) {
var output = fs.createWriteStream ('izs.me_index.html');
switch (response.headers ['konten-encoding']) {
// atau, cukup gunakan zlib.createunzip () untuk menangani kedua kasus
kasus 'gzip':
response.pipe (zlib.createGunzip ()). pipa (output);
merusak;
Kasus 'mengempis':
response.pipe (zlib.createInflate ()). pipa (output);
merusak;
bawaan:
response.pipe (output);
merusak;
}
});
0x03. Kompresi non-pipa
Kodenya adalah sebagai berikut:
Salinan kode adalah sebagai berikut:
#! /USR/LOCAL/BIN/NODE
var http = membutuhkan ('http'),
queryString = membutuhkan ('querystring'),
zlib = membutuhkan ('zlib');
var args = {
// Parameter dan data cadangan
Isi: queryString.stringify ({
// informasi kontrak
Nama: 'homeway.me',
}),
};
var options = {
Nama host: 'homeway.me',
Port: 80,
jalur: '/',
Metode: 'dapatkan',
header: {
'Accept': 'Text/html, Application/xhtml+xml, Application/xml; q = 0.9, Image/Webp,*/*; q = 0.8',
'Panjang konten': args.contents.length,
'Pengguna-agen': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (Khtml, Like Gecko) Chrome/42.0.2311.11 Safari/537.36',
'Accept-encoding': 'gzip, mengempiskan',
},
};
var get = fungsi (opsi, args, callback) {
var req = http.Request (option, function (res) {
var chunks = [], data, encoding = res.headers ['konten-encoding'];
// non-gzip/koplatif harus dikonversi ke format UTF-8
if (encoding === 'tidak terdefinisi') {
res.setencoding ('UTF-8');
}
res.on ('data', function (chunk) {
chunks.push (chunk);
});
res.on ('end', function () {
var buffer = buffer.concat (chunks);
if (encoding == 'gzip') {
zlib.gunzip (buffer, function (err, decoded) {
data = decoded.toString ();
callback (err, args, res.headers, data);
});
} lain jika (encoding == 'deflate') {
zlib.inflate (buffer, function (err, decoded) {
data = decoded.toString ();
callback (err, args, res.headers, data);
});
} kalau tidak {
data = buffer.toString ();
callback (null, args, res.headers, data);
}
});
});
req.write (args.contents);
req.end ();
};
get (opsi, args, function (err, args, header, data) {
console.log ('==> header /n', header);
console.log ('== data /n', data);
});
Di atas adalah semua nodej tentang kompresi GZIP/mengempis. Saya harap semua orang menyukainya.