Nodejs关于gzip/deflate压缩详解

标签:活动介绍    日期:2018-11-26 10:23    录入:美娱国际平台注册    浏览:

  

[nodejs,gzip]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压缩的全部内容了,希望大家能够喜欢。

  

★★★小编:美娱国际 整理文章,欢迎大家转载 ★★★
相关文章阅读
点击右上角的分享按钮即可收藏美娱国际平台注册 随时随地与好友一起分享精彩内容噢
最近更新
热门排行