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全局安装和本地安装的不同之处
Jul 04 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 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类的定义与继承用法实例
2015/07/07 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
JavaScript 异步调用框架 (Part 4 - 链式调用)
2009/08/04 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
[17:36]VG战队纪录片
2014/08/21 DOTA
Pyramid添加Middleware的方法实例
2013/11/27 Python
Python设计模式之代理模式实例
2014/04/26 Python
python回调函数用法实例分析
2015/05/09 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python操作MongoDB数据库的方法示例
2018/01/04 Python
tornado+celery的简单使用详解
2019/12/21 Python
python实现IOU计算案例
2020/04/12 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
Python如何获取文件路径/目录
2020/09/22 Python
python 如何在测试中使用 Mock
2021/03/01 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
Final类有什么特点
2012/04/25 面试题
早会主持词
2014/03/17 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
大学活动总结模板
2014/07/10 职场文书
合作协议书模板2014
2014/09/26 职场文书
父亲节活动总结
2015/02/12 职场文书
实施意见格式范本
2015/06/05 职场文书
女儿满月酒致辞
2015/07/29 职场文书
搞笑婚礼主持词开场白
2015/11/24 职场文书
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS