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 Post请求报socket hang up错误的解决办法
Sep 25 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 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中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
php mail to 配置详解
2014/01/16 PHP
php分页函数示例代码分享
2014/02/24 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
JS实现基本的网页计算器功能示例
2020/01/16 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Django实现组合搜索的方法示例
2018/01/23 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
Python reversed函数及使用方法解析
2020/03/17 Python
python如何实时获取tcpdump输出
2020/09/16 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
积极分子思想汇报
2014/01/04 职场文书
一年级家长会邀请函
2014/01/25 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
万能检讨书
2015/01/27 职场文书
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
Python采集股票数据并制作可视化柱状图
2022/04/04 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js