9

Ruby 1.9.3p194 で Rails 3.2.7 を実行して、SQLite データベースから JSON データを出力しています。

render :json => result.to_json

Android アプリケーションは、以下を介してロードされる JSON ファイルを使用しますHTTP-GET

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(urlPath);
HttpResponse response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, HTTP.UTF_8);
JSONObject jsonObject = new JSONObject(result);

プラットフォームのサポート:

Rails が次のようにgzip サポートを提供しているAPI を読みました。

ActiveSupport::Gzip.compress(result)

また、HTTP/1.1、RFC2626、セクション 14.3から、HTTP 要求のヘッダーを構成できると推測します。

httpPost.setHeader("Accept-Encoding", "gzip");

また、セクション 3.5「コンテンツ コーディング」に含まれている非常に興味深い情報も見つけました。

  • すべての content-coding 値は、大文字と小文字を区別しません。
  • HTTP/1.1 は、Accept-Encoding (セクション 14.3) およびContent-Encoding (セクション 14.11) ヘッダー フィールドで content-coding 値を使用します。
  • Internet Assigned Numbers Authority (IANA) は、コンテンツ コーディング値トークンのレジストリとして機能します。最初に、レジストリには次のトークンが含まれています。
    • gzip RFC 1952 [25] で説明されているように、ファイル圧縮プログラム「gzip」(GNU zip) によって生成されるエンコード形式。

この投稿では、Android で GZIP エンコードされたコンテンツを処理する方法について詳しく説明します。

サーバーのテスト:

したがって、データがサーバーによって圧縮されているかどうかを確認する方法がわかりません。Railsがgzipを出力するかどうかをテストするために、ここで提案されているようにcurlを使用しようとしました:

$ curl --head -H "Accept-Encoding: gzip" http://localhost:3000/posts.json

ただし、gzip がサポートされているかどうかは出力からわかりません。

HTTP/1.1 200 OK 
Content-Type: application/json; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "f6f6732c747466f75052f88b1eff393b"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 74ee0562c05adea679deb701f1b8fd88
X-Runtime: 0.004205
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Thu, 16 Aug 2012 23:33:25 GMT
Connection: Keep-Alive

curl--compressedのパラメータも試してみました...

$ curl --compressed --head -H "Accept-Encoding: gzip" http://localhost:3000/posts.json

前のコマンドと同じヘッダー情報を出力します。走ると…

$ curl --compressed -H "Accept-Encoding: gzip" http://localhost:3000/posts.json

JSON データは、読み取り可能なテキストとしてコンソールに出力されます。圧縮が行われたかどうかはわかりません。おそらく、curlはすでに応答を解凍しているためでしょうか?!

オンラインテスト

ここで説明したオンライン テストHTTP Compression Testも試しました。JSON コンテンツが「gzip されていない」ことを確認しました。ここにリンクされている2 番目の Web サイトGIDZipTestは、否定的なテスト結果を認めています。

質問:

  1. Railsからgzip圧縮されたJSONを出力するにはどうすればよいですか?
  2. gzip 圧縮データを要求するように HTTP クライアントを構成するにはどうすればよいですか?
  3. Rails サーバーを Heroku (PostgreSQL) で実行すると、同じ構成が機能しますか?

学んだ教訓

私が学んだように、REST サーバー用に構成する必要があるのはuse Rack::Deflater. ActiveSupport::Gzip.compress()明確にするために:私は自分のコードでは使用しません。興味のある方のために説明すると、GZIP 圧縮が有効になっているときのヘッダーは次のようになります。

HTTP/1.1 200 OK 
Content-Type: application/json; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "8170a04be41673bf25824256740a9460"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 700b9536f6a20164d31b8528bde423af
X-Runtime: 0.369337
Vary: Accept-Encoding
Content-Encoding: gzip
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Tue, 21 Aug 2012 12:10:48 GMT
Content-Length: 20
Connection: Keep-Alive

魔法のキーワードがわかったので、 の記事を簡単に検索して見つけるuse Rack::Deflaterことができます。

4

1 に答える 1

7

Rack::Deflater を使用する必要がありますか? config.ru に挿入:

require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Deflater
run MyAppName::Application

http リクエスト ヘッダーを設定します。

HTTP リクエストのヘッダーを構成できます。

httpPost.setHeader("Accept-Encoding", "gzip");

PS同じ構成がHerokuで動作します

于 2012-08-19T17:35:08.693 に答える