2013-05-27 581 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 } 

和更新此文件定期