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的url截取模块url-extract的使用实例
Nov 18 NodeJs
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
NodeJs——入门必看攻略
Jun 27 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
NodeJS实现一个聊天室功能
Nov 25 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/07/29 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
vue.js 获取当前自定义属性值
2017/06/01 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Djang中静态文件配置方法
2015/07/30 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
Python语言进阶知识点总结
2019/05/28 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
Ann Taylor官方网站:美国最大的女性产品制造商之一
2016/09/14 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
优秀士兵个人事迹材料
2014/01/19 职场文书
安全生产检查通报
2014/01/29 职场文书
学习经验交流会主持词
2014/04/01 职场文书
工厂搬迁方案
2014/05/11 职场文书
欢迎新生标语
2014/10/06 职场文书
离职报告格式
2014/11/04 职场文书
2014年基层党支部工作总结
2014/12/04 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
摘录式读书笔记
2015/07/01 职场文书
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL
python字符串的一些常见实用操作
2022/04/06 Python