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)
您可以通过设置自定义标头来查询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
以帮助我们进一步解决问题。