2013-05-27 215 views
18

私はapiを各リクエストでJSON応答で応答するレールで書いています。gzip圧縮でjson応答を返す

応答が巨大になる可能性があるので、gzipを使用してJSON応答を圧縮する必要があります。

これをレールコントローラで行う方法をお探しですか?私はconfig.ru

にライン

use Rack::Deflater 

を追加した

は、私はまた、JSONをレンダリングするラインで何かを変えるべきでしょうか?

render :json => response.to_json() 

また、応答がgzip形式であるかどうかを確認するにはどうすればいいですか?

私は端末からカールリクエストをしましたが、普通のプレーンなJSONしか表示されません。

答えて

12

応答がgzip形式であるために、renderメソッド呼び出しを変更する必要はありません。
リクエストにヘッダAccept-Encoding: gzipがある場合、Railsは自動的にgzipを使用してJSON応答を圧縮します。

プリセットヘッダーとリクエストを送信するユーザーをしたくない場合は、レスポンスをレンダリングする前に、コントローラに手動で要求にヘッダを追加することができます。

request.env['HTTP_ACCEPT_ENCODING'] = 'gzip' 
render :json => response.to_json() 
+0

以下の@ curiousmindの応答を確認 - あなたも 'ラックを追加する必要があります:: Deflaterミドルウェアを使用してRailsにJSONレスポンスを圧縮させ、_evenならAccept-Encodingリクエストヘッダを 'gzip、deflate'に渡しました。リクエストヘッダーは圧縮にも必要です。 – sameers

4

あなたはカールによってを照会することができますカスタムヘッダーを設定すると、実際の応答のJSON

$ gzip -d posts_json.gz 
$ cat posts_json 
を表示するためにそれを解凍し、その後、その後、

$ curl -H "Accept-Encoding: gzip, deflate" localhost:3000/posts.json > posts_json.gz 

gzipで圧縮された応答を取得するには10

動作しない場合。出力をrake middlewaresにポストバックして、トラブルシューティングに役立ててください。

+3

ヘッダーとともに、実際にファイルを圧縮するために、アプリケーションのapplication.rbファイルに 'config.middleware.use Rack :: Deflater'を追加する必要がありました。 –

23

私の投稿Content Compression with Rack::Deflaterには、Rack :: Deflaterを統合するための2つの方法が記載されています。

module YourApp 
    class Application < Rails::Application 
    config.middleware.use Rack::Deflater 
    end 
end 

とクライアントが明示的に、彼らはそれを扱うことができると言う場合は、自動的にデフレート/ gzipですべてのコントローラの応答を圧縮します:最も簡単なだけでconfig/application.rbを更新することです。あなたがファイルに巨大な応答を書き、それをgzipするために検討することができますいくつかのケースでは

+0

gzipレスポンスを得るために、このRack Middleware宣言とヘッダーが必要でした。ありがとう! –

+0

'config.middleware.use Rack :: Deflater'をapplication.rbに追加します。圧縮はMac OS(Chrome、FF、Safary)でのみ動作します。ウィンドウズでは、私は 'Content-Encoding:gzip;' FFとIEで(クロムでのみ動作します)。 P.S. "Accept-Encoding:gzip"はすべてのブラウザに存在します。理由は分かりますか?) – bmalets

+0

@bmaletsこれはまだ起こりますか?これを回避する方法を見つけた? –

0

res = {} # huge data hash 
json = res.to_json 

Zlib::GzipWriter.open('public/api/huge_data.json.gz') { |gz| gz.write json } 

と、このファイルを定期的に更新