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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
nodeJs内存泄漏问题详解
Sep 05 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 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模块memcache和memcached区别分析
2011/06/14 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
图片翻转效果具体实现代码
2014/01/09 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
取得元素的左和上偏移量的方法
2014/09/17 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
利用python写个下载teahour音频的小脚本
2017/05/08 Python
Python中文编码知识点
2019/02/18 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
django使用多个数据库的方法实例
2021/03/04 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
找到不普通的东西:Bonanza
2016/10/20 全球购物
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
会议邀请函范文
2014/01/09 职场文书
秋季运动会通讯稿
2014/01/24 职场文书
制药工程专业职业生涯规划范文
2014/03/10 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
2015年医生个人工作总结
2015/04/25 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技