如何使用请求或HTTP模块读取gzip的页面转换成字符串(How to use request or

2019-06-23 17:48发布

我发现在JS请求模块不能处理的gzip或正确地膨胀格式http响应。

例如:

request({url:'some url'}, function (error, response, body) {
   //if the content-encoding is gzip, the body param here contains binaries other than readable string. And even worse after you convert the body to buffer, u even can not gunzip it.
}

所以我想用官方文档的示例代码。

var request = http.get({ host: 'izs.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;
  }
});

问题是,代码编写的网页到一个文件,我希望它可以在页面写字符串,这样我可以处理页面。 我找不到像“字符串流”的任何类。

如果有人对此有什么想法,这将是巨大的。

Answer 1:

管响应gzip的数据流,并使用它,就像使用原来的响应对象。

var req = http.request(options, function(res) {
    var body = "";

    res.on('error', function(err) {
       next(err);
    });

    var output;
    if( res.headers['content-encoding'] == 'gzip' ) {
      var gzip = zlib.createGunzip();
      res.pipe(gzip);
      output = gzip;
    } else {
      output = res;
    }

    output.on('data', function (data) {
       data = data.toString('utf-8');
       body += data;
    });

    output.on('end', function() {
        return next(false, body);
    });
 });

req.on('error', function(err) {
   next(err);
})


Answer 2:

简化的例子:

var https = require('https');
var gunzip = require('zlib').createGunzip();

var options = {
    host: 'api.stackexchange.com',
    path: '/2.1/info?site=stackoverflow'
};

https.get(options, function(res) {
  var body = '';

  res.pipe(gunzip);

  gunzip.on('data', function (data) {
      body += data;
  });

  gunzip.on('end', function() {
      console.log(JSON.parse(body));
  });
});


Answer 3:

我遇到了类似的问题,并希望继续使用该request库,而不是内置的HTTP模块。 我在这里讨论了两种工作方式: http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression 。 其中之一是类似于@ Teemu的回答,而其他用途流。



Answer 4:

请求模块处理gzip的响应。 所有我们需要做的是设置在OPTS“gzip的”属性。 有关详细的解释,请访问以下临客。 在那里,我已经清楚地为例进行说明。

https://stackoverflow.com/a/38582506/5878471



Answer 5:

@Dawid和@Teemu的答案有时制动器在答案的字符以UTF-8编码的情况下。 此代码的效果要好得多:

function getGzipped(url, cb) {
    // downloads gzipped file
    http.get(url, function(res) {

        let chunks = [];

        res.on('data', function(chunk) {
            chunks.push(chunk);
        });
        res.on('end', function() {
            let buffer = Buffer.concat(chunks);
            zlib.gunzip(buffer, function(err, decoded) {
                if (err) throw err;
                cb(decoded && decoded.toString());
            });
        });
    });
}


文章来源: How to use request or http module to read gzip page into a string