源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Nodejs关于gzip/deflate压缩详解

  • 时间:2021-06-15 14:11 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Nodejs关于gzip/deflate压缩详解
[b]0x01.关于[/b] 写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。 关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。 [b]0x02.管道压缩[/b] Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。 当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。 NodeJS中通过各种Stream来提供对数据流的操作。 官网提供了管道方法:
[u]复制代码[/u] 代码如下:
// 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;     } });
[b]0x03.非管道压缩[/b] 代码如下:
[u]复制代码[/u] 代码如下:
#! /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压缩的全部内容了,希望大家能够喜欢。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部