Railsで記述されたAPIがあります。これは、各リクエストでJSON応答で応答します。
応答が巨大になる可能性があるため、gzipを使用してJSON応答を圧縮する必要があります。
Railsコントローラでこれを行う方法を疑問に思いますか?
私は行を追加しました
use Rack::Deflater
config.ru
JSONをレンダリングする行で何かを変更する必要もありますか?
render :json => response.to_json()
また、応答がgzip形式かどうかを確認するにはどうすればよいですか?
端末からcurlリクエストを行いましたが、通常のプレーンなJSONしか表示されません。
応答をgzip形式にするために、render
メソッド呼び出しを変更する必要はありません。
リクエストにヘッダーAccept-Encoding: gzip
、Railsは、gzipを使用してJSON応答を自動的に圧縮します。
ユーザーがヘッダーを事前設定してリクエストを送信したくない場合は、レスポンスをレンダリングする前に、コントローラーでヘッダーをリクエストに手動で追加できます。
request.env['HTTP_ACCEPT_ENCODING'] = 'gzip'
render :json => response.to_json()
私の投稿 Rack :: Deflaterによるコンテンツ圧縮 は、Rack :: Deflaterを統合するいくつかの方法を説明しています。最も簡単な方法は、config/application.rb
を次のように更新することです。
module YourApp
class Application < Rails::Application
config.middleware.use Rack::Deflater
end
end
また、クライアントが明示的に処理できるとクライアントが明示的に言った場合は、deflate/gzipを使用してすべてのコントローラー応答を自動的に圧縮します。
カスタムヘッダーを設定して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
の出力をポストバックして、さらにトラブルシューティングを行います。
場合によっては、巨大な応答をファイルに書き込んでgzipすることを検討できます。
res = {} # huge data hash
json = res.to_json
Zlib::GzipWriter.open('public/api/huge_data.json.gz') { |gz| gz.write json }
このファイルを定期的に更新します