rails json使用gzip压缩响应

我有一个用rails编写的api,每个请求都响应一个JSON响应。

响应可能很大,所以我需要使用gzip压缩JSON响应。

想知道如何在rails控制器中执行此操作?

我添加了这条线

use Rack::Deflater 

在config.ru中

我是否还应该改变呈现JSON的行?

 render :json => response.to_json() 

另外,我如何检查响应是否是gzip格式.. ??

我从终端做了一个curl请求,我只看到普通的普通JSON。

我发布的内容压缩与Rack :: Deflater描述了几种集成Rack :: Deflater的方法。 最简单的方法是使用以下命令更新config/application.rb

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

如果客户端明确表示他们可以处理它,你将使用deflate / gzip自动压缩所有控制器响应。

对于gzip格式的响应,我们不必更改render方法调用。
如果请求具有头文件Accept-Encoding: gzip ,则Rails将使用gzip自动压缩JSON响应。

如果您不希望用户发送带预设标题的请求,您可以在呈现响应之前在控制器中手动将标题添加到请求中:

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

您可以通过设置自定义标头来获取gzip响应来查询Curl

 $ 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 } 

并定期更新此文件