Nodejs关于gzip/deflate压缩详解


Posted in NodeJs onMarch 04, 2015

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 相关文章推荐
nodejs实用示例 缩址还原
Dec 28 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 #NodeJs
Windows系统中安装nodejs图文教程
Feb 28 #NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 #NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 #NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 #NodeJs
NodeJs基本语法和类型
Feb 13 #NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 #NodeJs
You might like
PHP 中的批处理的实现
2007/06/14 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
深入分析PHP引用(&)
2014/09/04 PHP
thinkPHP实现的省市区三级联动功能示例
2017/05/05 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
vue路由权限校验功能的实现代码
2020/06/07 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
python 快速排序代码
2009/11/23 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
Python中的取模运算方法
2018/11/10 Python
Python实现分段线性插值
2018/12/17 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
大学生学习党课思想汇报
2014/01/03 职场文书
红领巾广播站广播稿
2014/02/01 职场文书
迟到检讨书500字
2014/02/05 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
如何Tomcat中使用ipv6地址
2022/05/06 Servers