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 \n', headers);

  console.log('==data \n', data);

  });

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