28

リクエストごとに JSON レスポンスで応答する Rails で記述された API があります。

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

Railsコントローラーでこれを行う方法を知りたいですか?

行を追加しました

use Rack::Deflater

config.ruで

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

render :json => response.to_json()

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

ターミナルから curl リクエストを実行しましたが、通常のプレーンな JSON しか表示されません。

4

5 に答える 5

13

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

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

request.env['HTTP_ACCEPT_ENCODING'] = 'gzip'
render :json => response.to_json()
于 2013-05-27T06:12:24.360 に答える
5

カスタム ヘッダーを設定して 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ポストバックして、さらなるトラブルシューティングに役立ててください。

于 2013-05-27T07:15:23.727 に答える
1

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

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

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

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

于 2016-03-02T21:09:59.780 に答える