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相关方法介绍
Mar 03 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
nodejs之get/post请求的几种方式小结
Jul 26 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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中addslashes函数与sql防注入
2014/11/17 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
php简单统计在线人数的方法
2016/05/10 PHP
thinkphp中U方法按路由规则生成url的方法
2018/03/12 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
PHP使用标准库spl实现的观察者模式示例
2018/08/04 PHP
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
JavaScript中的各种宽高属性的实现
2020/05/08 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
python遍历数组的方法小结
2015/04/30 Python
Python中的pass语句使用方法讲解
2015/05/14 Python
浅谈Python中copy()方法的使用
2015/05/21 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
Pyqt5自适应布局实例
2019/12/13 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
python如何快速生成时间戳
2020/07/21 Python
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
C#公司笔试题
2014/03/28 面试题
实习生矿工检讨书
2014/10/13 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
python中 Flask Web 表单的使用方法
2022/05/20 Python