0x01. เกี่ยวกับ
เมื่อเขียน HTTP รหัสที่อ่านไม่ออกจะปรากฏขึ้นเมื่อได้รับคำขอ HTTP ต่อมาฉันพบว่า GZIP ไม่ได้บีบอัด
เกี่ยวกับการบีบอัด GZIP/deflate มีวิธีการใส่ในการบีบอัดท่อและการบีบอัดที่ไม่ใช่ท่อ
0x02.pipe การบีบอัด
I/O ในโหนดเป็นแบบอะซิงโครนัสดังนั้นการอ่านและการเขียนลงในดิสก์และเครือข่ายจำเป็นต้องอ่านและเขียนลงในข้อมูลผ่านฟังก์ชั่นการโทรกลับ
เมื่อข้อมูลที่ต้องประมวลผลไม่สามารถโหลดได้ในหน่วยความจำในครั้งเดียวหรือเมื่อการประมวลผลมีประสิทธิภาพมากขึ้นในขณะที่อ่านเราจำเป็นต้องใช้สตรีมข้อมูล
NodeJS ให้การดำเนินการเกี่ยวกับสตรีมข้อมูลผ่านสตรีมต่างๆ
เว็บไซต์อย่างเป็นทางการมีวิธีการท่อ:
การคัดลอกรหัสมีดังนี้:
// ตัวอย่างคำขอของลูกค้า
var zlib = ต้องการ ('zlib');
var http = ต้องการ ('http');
var fs = ต้องการ ('fs');
var request = http.get ({host: 'homeway.me',
เส้นทาง: '/',
พอร์ต: 80,
ส่วนหัว: {'ยอมรับการเข้ารหัส': 'gzip, deflate'}});
request.on ('การตอบสนอง', ฟังก์ชั่น (การตอบสนอง) {
var output = fs.createWritestream ('izs.me_index.html');
switch (response.headers ['การเข้ารหัสเนื้อหา']) {
// หรือเพียงแค่ใช้ zlib.createunzip () เพื่อจัดการทั้งสองกรณี
กรณี 'gzip':
Response.pipe (zlib.creategunzip ()). ท่อ (เอาต์พุต);
หยุดพัก;
กรณี 'deflate':
Response.pipe (zlib.createinflate ()). ท่อ (เอาท์พุท);
หยุดพัก;
ค่าเริ่มต้น:
Response.pipe (เอาต์พุต);
หยุดพัก;
-
-
0x03. การบีบอัดที่ไม่ใช่ท่อ
รหัสมีดังนี้:
การคัดลอกรหัสมีดังนี้:
- /usr/local/bin/node
var http = reghed ('http')
queryString = reghed ('querystring')
zlib = ต้องการ ('zlib');
var args = {
// พารามิเตอร์และข้อมูลสำรอง
สารบัญ: querystring.stringify ({
// ข้อมูลการทำสัญญา
ชื่อ: 'homeway.me',
-
-
ตัวเลือก var = {
ชื่อโฮสต์: 'homeway.me',
พอร์ต: 80,
เส้นทาง: '/',
วิธี: 'รับ',
ส่วนหัว: {
'ยอมรับ': 'ข้อความ/html, แอปพลิเคชัน/xhtml+xml, แอปพลิเคชัน/xml; q = 0.9, รูปภาพ/webp,*/*; q = 0.8',
'ความยาวเนื้อหา': args.contents.length,
'ผู้ใช้ตัวแทน': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) Applewebkit/537.36 (khtml, เช่น Gecko) Chrome/42.0.2311.11 Safari/537.36'
'ยอมรับการเข้ารหัส': 'gzip, deflate',
-
-
var get = function (ตัวเลือก, args, callback) {
var req = http.request (ตัวเลือก, ฟังก์ชัน (res) {
var chunks = [], ข้อมูล, การเข้ารหัส = res.headers ['การเข้ารหัสเนื้อหา'];
// ไม่ใช่ gzip/deflate ควรแปลงเป็นรูปแบบ UTF-8
if (encoding === 'undefined') {
Res.setEncoding ('UTF-8');
-
res.on ('data', ฟังก์ชั่น (ก้อน) {
chunks.push (ก้อน);
-
res.on ('end', function () {
var buffer = buffer.concat (ชิ้น);
if (encoding == 'gzip') {
zlib.gunzip (บัฟเฟอร์, ฟังก์ชั่น (err, ถอดรหัส) {
data = decoded.toString ();
การโทรกลับ (err, args, res.headers, data);
-
} อื่นถ้า (encoding == 'deflate') {
zlib.inflate (บัฟเฟอร์, ฟังก์ชั่น (err, ถอดรหัส) {
data = decoded.toString ();
การโทรกลับ (err, args, res.headers, data);
-
} อื่น {
data = buffer.toString ();
การโทรกลับ (null, args, res.headers, data);
-
-
-
req.write (args.contents);
req.end ();
-
รับ (ตัวเลือก, args, ฟังก์ชั่น (err, args, ส่วนหัว, ข้อมูล) {
console.log ('==> ส่วนหัว /n', ส่วนหัว);
console.log ('== data /n', ข้อมูล);
-
ข้างต้นคือ nodejs ทั้งหมดเกี่ยวกับการบีบอัด GZIP/deflate ฉันหวังว่าทุกคนจะชอบมัน