手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >Nodejs关于gzip/deflate压缩详解
Nodejs关于gzip/deflate压缩详解
摘要:0x01.关于写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。关于gzip/deflate压缩,有放入管道压缩...

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 n', headers);

console.log('==data n', data);

});

以上就是Nodejs关于gzip/deflate压缩的全部内容了,希望大家能够喜欢。

【Nodejs关于gzip/deflate压缩详解】相关文章:

js同源策略详解

JavaScript Date对象详解

js中跨域方法原理详解

Javascript中Date类型和Math类型详解

JavaScript中的replace()方法使用详解

AngularJS的内置过滤器详解

jQuery中 prop() attr()使用详解

javascript瀑布流布局实现方法详解

javascript实现表格增删改操作实例详解

showModelessDialog()使用详解

精品推荐
分类导航