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实用示例 缩址还原
Dec 28 NodeJs
nodejs npm package.json中文文档
Sep 04 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 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 syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
PHP连接Access数据库的方法小结
2013/06/20 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
11个用于提高排版水平的基于jquery的文字效果插件
2012/09/14 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
vue的基本用法与常见指令
2017/08/15 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
微信小程序textarea层级过高(盖住其他元素)问题的解决办法
2019/03/04 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
[00:48]完美“圣”典2016风云人物:xiao8宣传片
2016/11/30 DOTA
Python里disconnect UDP套接字的方法
2015/04/23 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
python版DDOS攻击脚本
2019/06/12 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python实现粒子群算法的示例
2021/02/14 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
销售人员职业生涯规划范文
2014/03/01 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
整改报告格式
2014/11/06 职场文书
2014年度思想工作总结
2014/11/27 职场文书
高中生军训感言
2015/08/01 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
7个关于Python的经典基础案例
2021/11/07 Python