2013-05-27 593 views
18

我有一個寫在軌道上的API,每個請求響應一個JSON響應。rails json響應與gzip壓縮

響應可能很大,所以我需要使用gzip壓縮JSON響應。

想知道如何在軌道控制器中做到這一點?

我添加了這行

use Rack::Deflater 
在config.ru

我應該也是這使得JSON行會改變什麼

render :json => response.to_json() 

另外,我如何檢查響應是否在gzip格式或不。

我做了一個來自終端的curl請求,我只看到普通的普通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響應,即使你已經將Accept-Encoding請求頭設置爲'gzip,deflate'。請注意,請求頭還需要進行壓縮。 – sameers

4

您可以通過查詢捲曲:

如果您不希望用戶發送預設頭的請求,你可以在頭手動控制器呈現響應之前添加到請求設置自定義標題獲得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的輸出以幫助我們進一步排除故障。

+3

除了標頭外,我還必須將'config.middleware.use Rack :: Deflater'添加到應用程序的application.rb文件中,以便實際壓縮文件。 –

23

我的帖子Content Compression with Rack::Deflater描述了幾種整合Rack :: Deflater的方法。最簡單的是隻用更新config/application.rb

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

,你會自動壓縮與放氣/ gzip的所有控制器的響應,如果客戶明確地說,他們可以處理它。

+0

我需要這個機架中間件聲明以及頭文件來獲得gzip響應。謝謝! –

+0

我將'config.middleware.use Rack :: Deflater'添加到application.rb,壓縮僅在Mac OS(Chrome,FF和Safary)上開始工作。在Windows上,我收到沒有「Content-Encoding:gzip;」的回覆在FF和IE中(僅適用於Chrome)。附: 「Accept-Encoding:gzip」出現在所有瀏覽器中。你知道爲什麼嗎?) – bmalets

+0

@bmalets這是否仍然發生?找到解決辦法嗎? –

0

在某些情況下,你可以考慮寫巨大的反響到一個文件和gzip它:

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

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

和更新此文件定期