Nodejs关于gzip/deflate压缩详解
0x01.关于
写http时候,在接收http请求时候,出现乱码,后来发现是gzip没有解压。
关于gzip/deflate压缩,有放入管道压缩,和非管道压缩方法。
0x02.管道压缩
Node中的I/O是异步的,因此对磁盘和网络的读写需要通过回调函数来读取数据。
当内存中无法一次装下需要处理的数据时,或者一边读取一边处理更加高效时,我们就需要用到数据流。
NodeJS中通过各种Stream来提供对数据流的操作。
官网提供了管道方法:
//clientrequestexample varzlib=require('zlib'); varhttp=require('http'); varfs=require('fs'); varrequest=http.get({host:'homeway.me', path:'/', port:80, headers:{'accept-encoding':'gzip,deflate'}}); request.on('response',function(response){ varoutput=fs.createWriteStream('izs.me_index.html'); switch(response.headers['content-encoding']){ //or,justusezlib.createUnzip()tohandlebothcases 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 varhttp=require('http'), querystring=require('querystring'), zlib=require('zlib'); varargs={ //参数以及备用数据 contents:querystring.stringify({ //发包的信息 name:'homeway.me', }), }; varoptions={ 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;IntelMacOSX10_10_2)AppleWebKit/537.36(KHTML,likeGecko)Chrome/42.0.2311.11Safari/537.36', 'Accept-Encoding':'gzip,deflate', }, }; varget=function(options,args,callback){ varreq=http.request(options,function(res){ varchunks=[],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(){ varbuffer=Buffer.concat(chunks); if(encoding=='gzip'){ zlib.gunzip(buffer,function(err,decoded){ data=decoded.toString(); callback(err,args,res.headers,data); }); }elseif(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压缩的全部内容了,希望大家能够喜欢。