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 sublime text 3安装与配置
Jun 19 NodeJs
NodeJS学习笔记之网络编程
Aug 03 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
nodejs的路径问题的解决
Jun 30 NodeJs
NodeJs操作MongoDB教程之分页功能以及常见问题
Apr 09 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易混淆函数的区别及用法汇总
2014/11/22 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
PHP数组游标实现对数组的各种操作详解
2016/01/26 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
PHP count()函数讲解
2019/02/03 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
jquery时间下拉框小例子
2013/04/15 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
jQuery实现页码跳转式动态数据分页
2017/12/31 jQuery
Vue.js的动态组件模板的实现
2018/11/26 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python中实现结构相似的函数调用方法
2015/03/10 Python
python中dir函数用法分析
2015/04/17 Python
Python赋值语句后逗号的作用分析
2015/06/08 Python
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
利用Python优雅的登录校园网
2020/10/21 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
党校培训思想汇报
2013/12/30 职场文书
财务出纳岗位职责
2014/02/03 职场文书
将相和教学反思
2014/02/04 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
后进生评语大全
2015/01/04 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang