Welcome 微信登录

首页 / 脚本样式 / JavaScript / Nodejs关于gzip/deflate压缩详解

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 ", headers);
    console.log("==data ", data);
});

以上就是Nodejs关于gzip/deflate压缩的全部内容了,希望大家能够喜欢。