15

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;
  }
});

問題は、コードが Web ページをファイルに書き込んでいることです。ページを処理できるように、ページを文字列に書き込めることを願っています。「StringStream」のようなクラスが見つかりませんでした。

誰かがこれについて何か考えを持っているなら、それは素晴らしいことです.

4

5 に答える 5

21

応答を 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);
})
于 2012-05-15T14:33:39.893 に答える
3

request モジュールが gzip 応答を処理します。オプションで「gzip」属性を設定するだけです。詳細な説明については、以下のリンクを参照してください。そこでは、例を挙げて明確に説明しました。

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

于 2016-07-26T07:04:44.720 に答える
3

request私は同様の問題に遭遇し、組み込みの http モジュールの代わりにライブラリを引き続き使用したいと考えました。ここで 2 つの作業アプローチについて説明しました: http://nickfishman.com/post/49533681471/nodejs-http-requests-with-gzip-deflate-compression。そのうちの 1 つは @Teemu の回答に似ていますが、もう 1 つはストリームを使用しています。

于 2013-05-04T02:06:49.857 に答える
2

@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());
            });
        });
    });
}
于 2016-04-10T13:46:46.740 に答える