0x01. Acerca de
Al escribir HTTP, aparece el código confusión al recibir solicitudes HTTP. Más tarde, descubrí que GZIP no está descomprimido.
Con respecto a la compresión GZIP/deflate, existen métodos para poner en compresión de tubería y compresión no tubelada.
0x02. compresión de tubería
La E/S en el nodo es asíncrona, por lo que leer y escribir en el disco y la red requiere leer y escribir a los datos a través de funciones de devolución de llamada.
Cuando los datos que deben procesarse no se pueden cargar en la memoria a la vez, o cuando el procesamiento es más eficiente mientras lee, necesitamos usar flujos de datos.
NodeJS proporciona operaciones en flujos de datos a través de varias transmisiones.
El sitio web oficial proporciona métodos de tubería:
La copia del código es la siguiente:
// Ejemplo de solicitud del cliente
var zLib = require ('zlib');
var http = require ('http');
var fs = require ('fs');
Var request = http.get ({host: 'homeway.me',
camino: '/',
Puerto: 80,
encabezados: {'aceptar-ending': 'gzip, deflate'}});
request.on ('respuesta', function (respuesta) {
varilla var = fs.CreateWriteStream ('Izs.me_index.html');
Switch (Respuesta.Headers ['Content-ending']) {
// o solo usa zlib.createunzip () para manejar ambos casos
Caso 'Gzip':
respuesta.pipe (zlib.creategunzip ()). tubería (salida);
romper;
caso 'desinflar':
respuesta.pipe (zlib.createInflate ()). tubería (salida);
romper;
por defecto:
respuesta.pipe (salida);
romper;
}
});
0x03. Compresión no tubelada
El código es el siguiente:
La copia del código es la siguiente:
#! /usr/local/bin/nodo
var http = require ('http'),
QueryString = require ('QueryString'),
zlib = require ('zlib');
var args = {
// Parámetros y datos de copia de seguridad
Contenido: QueryString.Stringify ({
// Información de contratación
Nombre: 'Homeway.me',
}),
};
opciones var = {
nombre de host: 'homeway.me',
Puerto: 80,
camino: '/',
Método: 'Get',
Encabezados: {
'Aceptar': 'text/html, aplicación/xhtml+xml, aplicación/xml; q = 0.9, imagen/webp,*/*; q = 0.8',
'Content-longitud': args.contents.length,
'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebkit/537.36 (khtml, como gecko) Chrome/42.0.2311.11 safari/537.36',,,,
'Aceptar-codificación': 'gzip, desinflar',
},
};
var get = function (opciones, args, devolución de llamada) {
var req = http.request (opciones, function (res) {
var fragmentos = [], datos, codificación = res.headers ['content-ending'];
// no gzip/deflate debe convertirse en formato UTF-8
if (coding === 'Undefined') {
res.setEncoding ('UTF-8');
}
res.on ('Data', Function (Chunk) {
trozos.push (fragmento);
});
res.on ('end', function () {
var buffer = buffer.concat (fragmentos);
if (coding == 'gzip') {
zlib.gunzip (buffer, function (err, decoded) {
data = decoded.toString ();
devolución de llamada (err, args, res.headers, datos);
});
} else if (encoding == 'deflate') {
zlib.inflate (buffer, function (err, decoded) {
data = decoded.toString ();
devolución de llamada (err, args, res.headers, datos);
});
} demás {
data = buffer.ToString ();
devolución de llamada (nulo, args, res.headers, datos);
}
});
});
req.write (args.contents);
req.end ();
};
get (opciones, args, función (err, args, encabezados, datos) {
console.log ('==> encabezado /n', encabezados);
console.log ('== data /n', datos);
});
Lo anterior es todo NodeJS sobre la compresión GZIP/Deflaz. Espero que a todos les guste.