web-dev-qa-db-ja.com

rails gzip圧縮によるjson応答

Railsで記述されたAPIがあります。これは、各リクエストでJSON応答で応答します。

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

Railsコントローラでこれを行う方法を疑問に思いますか?

私は行を追加しました

use Rack::Deflater

config.ru

JSONをレンダリングする行で何かを変更する必要もありますか?

render :json => response.to_json()

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

端末からcurlリクエストを行いましたが、通常のプレーンなJSONしか表示されません。

25
aBadAssCowboy

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

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

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

私の投稿 Rack :: Deflaterによるコンテンツ圧縮 は、Rack :: Deflaterを統合するいくつかの方法を説明しています。最も簡単な方法は、config/application.rbを次のように更新することです。

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

また、クライアントが明示的に処理できるとクライアントが明示的に言った場合は、deflate/gzipを使用してすべてのコントローラー応答を自動的に圧縮します。

30
djcp

カスタムヘッダーを設定してCurlをクエリし、gzip圧縮された応答を取得できます

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

次に、解凍​​して実際の応答jsonを表示します

 $ gzip -d posts_json.gz
 $ cat posts_json

それが機能しない場合。 rake middlewaresの出力をポストバックして、さらにトラブルシューティングを行います。

5
CuriousMind

場合によっては、巨大な応答をファイルに書き込んでgzipすることを検討できます。

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

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

このファイルを定期的に更新します

1
Lev Lukomsky