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は、否定的なテスト結果を認めています。
質問:
- Railsからgzip圧縮されたJSONを出力するにはどうすればよいですか?
- gzip 圧縮データを要求するように HTTP クライアントを構成するにはどうすればよいですか?
- 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
ことができます。