web-dev-qa-db-ja.com

node.js-gzip / deflate圧縮を使用した簡単なhttpリクエスト

HTTP/HTTPSリクエストを簡単に送信し、gzip/deflate圧縮応答とCookieを処理する最良の方法を見つけようとしています。

私が見つけた最高のものは https://github.com/mikeal/request であり、これはすべてexcept圧縮を処理します。私が尋ねるすべてを行うモジュールまたはメソッドはありますか?

そうでない場合、何らかの方法でリクエストとzlibを組み合わせることができますか? zlibとhttp.ServerRequestを組み合わせようとしましたが、失敗しました。

ありがとう!

45
wridgers

注:2019年現在、リクエストにはgzip解凍機能が組み込まれています。以下の方法を使用してリクエストを手動で解凍することもできます。

requestzlibをストリームと単純に組み合わせることができます。

以下は、ポート8000​​でリッスンしているサーバーがあると仮定した例です。

var request = require('request'), zlib = require('zlib');

var headers = {
    'Accept-Encoding': 'gzip'
};

request({url:'http://localhost:8000/', 'headers': headers})
    .pipe(zlib.createGunzip()) // unzip
    .pipe(process.stdout); // do whatever you want with the stream
70
jcreignou

これに最近遭遇した人のために、リクエストライブラリはすぐにgzip解凍をサポートしています。次のように使用します。

request(
    { method: 'GET'
    , uri: 'http://www.google.com'
    , gzip: true
    }
  , function (error, response, body) {
      // body is the decompressed response body
      console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
      console.log('the decoded data is: ' + body)
    }
  )

Githubのreadmeから https://github.com/request/request

gzip-trueの場合、Accept-Encodingヘッダーを追加して、サーバーに圧縮コンテンツエンコーディングを要求し(存在しない場合)、応答でサポートされているコンテンツエンコーディングをデコードします。注:応答コンテンツの自動デコードは、要求を通じて返された本文データに対して実行されます(要求ストリームを通じてコールバック関数に渡されます)が、変更されていないhttpである応答ストリーム(応答イベントから利用可能)では実行されません圧縮データを含む可能性のある.IncomingMessageオブジェクト。以下の例を参照してください。

92
Ryan Knell

応答をgunzipする実際の例です

function gunzipJSON(response){

    var gunzip = zlib.createGunzip();
    var json = "";

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

    gunzip.on('end', function(){
        parseJSON(json);
    });

    response.pipe(gunzip);
}

完全なコード: https://Gist.github.com/0xPr0xy/5002984

6
user764155

http://nodejs.org/docs/v0.6.0/api/zlib.html#examples の例をご覧ください

zlibがノードに組み込まれました。

3
Dick Hardt

ソースコード の内部を見ると、gzipが機能するために、リクエストライブラリ自体にgzip paramを設定する必要があります。これが意図的かどうかはわかりませんが、これは現在の実装です。追加のヘッダーは必要ありません。

var request = require('request');
request.gzip = true;
request({url: 'https://...'},  // use encoding:null for buffer instead of UTF8
    function(error, response, body) { ... }
);
1
Yurik