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压缩的全部内容了,希望大家能够喜欢。
问题内容: 我试图弄清楚如何轻松发送HTTP / HTTPS请求以及处理gzip / deflate压缩响应以及cookie的最佳方法。 我发现最好的是https://github.com/mikeal/request,它可以处理 除 压缩 以外的 所有内容。是否有模块或方法可以满足我的要求? 如果没有,我可以某种方式组合请求和zlib吗?我尝试将zlib和组合在一起,但失败了。 问题答案: 注意
DEFLATE 是同时使用了哈夫曼编码(Huffman Coding)与 LZ77 算法的一个无损数据压缩算法,是一种压缩数据流的算法。任何需要流式压缩的地方都可以用。目前 zip 压缩文件默认使用的就是该算法。 关于算法的原理,以及 哈夫曼编码(Huffman Coding)与 LZ77 算法,感兴趣的读者可以查询相关资料,这里推荐 GZIP压缩原理分析——第五章 Deflate算法详解 序列文
我想在JavaScript中做解压缩图像。我已经用C#使用gzip压缩了图像。如何在JavaScript中解压缩gzipped数据? C#代码
问题内容: 我正在使用php的功能来执行HTTP请求。为了节省带宽,我决定使用添加标题。 显然,输出一个gzip编码的字符串,所以我用来解码该编码的字符串,但是将作为参数传递的数据出错。 我知道还有另一个功能可以解压缩压缩后的数据,但是它不包含在我的PHP版本中(也许仅在SVN上可用)。 我知道cUrl可以即时解码gzip流(没有任何问题),但是有人建议我使用它而不是cUrl。 您是否知道以其他方
问题内容: 我想使用Gzip压缩来压缩java中的输入流。 假设我们有一个未压缩的输入流(1GB数据..)。因此,我需要从源压缩的输入流: 问题答案: DeflaterInputStream不是您想要的,因为它缺少gzip标头/预告片,并且使用略有不同的压缩方式。 如果从OutputStream(推)更改为InputStream(拉),则需要做不同的事情。 GzipOutputStream的作用是