Nodejs关于gzip/deflate压缩详解
作者:bea
0x01.关于 写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。 关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。 0x02.管道压缩 Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。 NodeJS中通过各种Stream来提供对数据流的操作。 官网提供了管道方法: 代码如下: // client r
0x01.关于
写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。
关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。
0x02.管道压缩
Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。
NodeJS中通过各种Stream来提供对数据流的操作。
官网提供了管道方法:
代码如下:
// client request example
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
var request = http.get({ host: 'homeway.me',
path: '/',
port: 80,
headers: { 'accept-encoding': 'gzip,deflate' } });
request.on('response', function(response) {
var output = fs.createWriteStream('izs.me_index.html');
switch (response.headers['content-encoding']) {
// or, just use zlib.createUnzip() to handle both cases
case 'gzip':
response.pipe(zlib.createGunzip()).pipe(output);
break;
case 'deflate':
response.pipe(zlib.createInflate()).pipe(output);
break;
default:
response.pipe(output);
break;
}
});
0x03.非管道压缩
代码如下:
代码如下:
#! /usr/local/bin/node
var http = require('http'),
querystring = require('querystring'),
zlib = require('zlib');
var args = {
//参数以及备用数据
contents : querystring.stringify({
//发包的信息
name:'homeway.me',
}),
};
var options = {
hostname: 'homeway.me',
port: 80,
path: '/',
method: 'GET',
headers: {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Content-Length': args.contents.length,
'User-Agent':'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, deflate',
},
};
var get = function ( options, args, callback ){
var req = http.request(options, function (res) {
var chunks =[], data, encoding = res.headers['content-encoding'];
// 非gzip/deflate要转成utf-8格式
if( encoding === 'undefined'){
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);
});
} else if (encoding == 'deflate') {
zlib.inflate(buffer, function (err, decoded) {
data = decoded.toString();
callback( err, args, res.headers, data);
});
} else {
data = buffer.toString();
callback( null, args, res.headers, data);
}
});
});
req.write( args.contents );
req.end();
};
get( options, args, function (err, args, headers, data){
console.log('==>header
', headers);
console.log('==data
', data);
});
以上就是Nodejs关于gzip/deflate压缩的全部内容了,希望大家能够喜欢。
有用 | 无用
写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。
关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。
0x02.管道压缩
Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。
NodeJS中通过各种Stream来提供对数据流的操作。
官网提供了管道方法:
代码如下:
// client request example
var zlib = require('zlib');
var http = require('http');
var fs = require('fs');
var request = http.get({ host: 'homeway.me',
path: '/',
port: 80,
headers: { 'accept-encoding': 'gzip,deflate' } });
request.on('response', function(response) {
var output = fs.createWriteStream('izs.me_index.html');
switch (response.headers['content-encoding']) {
// or, just use zlib.createUnzip() to handle both cases
case 'gzip':
response.pipe(zlib.createGunzip()).pipe(output);
break;
case 'deflate':
response.pipe(zlib.createInflate()).pipe(output);
break;
default:
response.pipe(output);
break;
}
});
0x03.非管道压缩
代码如下:
代码如下:
#! /usr/local/bin/node
var http = require('http'),
querystring = require('querystring'),
zlib = require('zlib');
var args = {
//参数以及备用数据
contents : querystring.stringify({
//发包的信息
name:'homeway.me',
}),
};
var options = {
hostname: 'homeway.me',
port: 80,
path: '/',
method: 'GET',
headers: {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Content-Length': args.contents.length,
'User-Agent':'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, deflate',
},
};
var get = function ( options, args, callback ){
var req = http.request(options, function (res) {
var chunks =[], data, encoding = res.headers['content-encoding'];
// 非gzip/deflate要转成utf-8格式
if( encoding === 'undefined'){
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);
});
} else if (encoding == 'deflate') {
zlib.inflate(buffer, function (err, decoded) {
data = decoded.toString();
callback( err, args, res.headers, data);
});
} else {
data = buffer.toString();
callback( null, args, res.headers, data);
}
});
});
req.write( args.contents );
req.end();
};
get( options, args, function (err, args, headers, data){
console.log('==>header
', headers);
console.log('==data
', data);
});
以上就是Nodejs关于gzip/deflate压缩的全部内容了,希望大家能够喜欢。
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- 基于jQuery实现仿淘宝套餐选择插件
- js实现类似于add(1)(2)(3)调用方式的方法
- jquery 插件实现多行文本框[textarea]自动高度
- JavaScript常用脚本汇总(三)
- JavaScript常用脚本汇总(二)
- JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
- JavaScript常用脚本汇总(一)
- JS+CSS实现Div弹出窗口同时背景变暗的方法
- js实现iGoogleDivDrag模块拖动层拖动特效的方法
- JavaScript中的关联数组问题
- JavaScript中常见获取元素的方法汇总
- 深入理解JavaScript系列(17):面向对象编程之概论详细介绍
- JavaScript设置获取和设置属性的方法
- 深入理解JavaScript系列(50):Function模式(下篇)
- 深入探讨javascript中的数据类型
- 深入理解JavaScript系列(49):Function模式(上篇)
- js实现百度联盟中一款不错的图片切换效果完整实例
- jQuery中大家不太了解的几个方法
- 深入理解JavaScript系列(48):对象创建模式(下篇)