rails json使用gzip压缩响应

aBa*_*boy 24 json gzip rack ruby-on-rails ruby-on-rails-3

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

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

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

我添加了这条线

use Rack::Deflater
Run Code Online (Sandbox Code Playgroud)

在config.ru中

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

render :json => response.to_json()
Run Code Online (Sandbox Code Playgroud)

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

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

小智 29

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

module YourApp
  class Application < Rails::Application
    config.middleware.use Rack::Deflater
  end
end
Run Code Online (Sandbox Code Playgroud)

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


aBa*_*boy 13

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

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

request.env['HTTP_ACCEPT_ENCODING'] = 'gzip'
render :json => response.to_json()
Run Code Online (Sandbox Code Playgroud)


Cur*_*ind 5

您可以通过设置自定义标头来查询Curl,以获取压缩后的响应

$ curl -H "Accept-Encoding: gzip, deflate" localhost:3000/posts.json > posts_json.gz
Run Code Online (Sandbox Code Playgroud)

然后,将其解压缩以查看实际的响应json

 $ gzip -d posts_json.gz
 $ cat posts_json
Run Code Online (Sandbox Code Playgroud)

如果不起作用。回传结果为,rake middlewares以帮助我们进一步解决问题。

  • 除了标题之外,我还必须在应用程序的application.rb文件中添加“ config.middleware.use Rack :: Deflater”,以使其实际压缩文件。 (3认同)