Rails 支持 Response 数据 GZip 压缩 json

转自:http://dijkst.github.io/blog/2013/07/18/rang-rails-zhi-chi-response-shu-ju-gzip-ya-suo/

在 Rails 项目根目录下的config.ru,加入use Rack::Deflater,如下:

config.ru
1
2
3
4
# This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) use Rack::Deflater run Wending::Application 

重启服务器即可。

如何判断是否生效了?那就来个测试。

先看看没有 GZip 压缩是什么样子的:

1
$ curl http://127.0.0.1:3000/ 

再看看使用了 GZip 压缩是什么样子的:

1
$ curl -H "Accept-Encoding: gzip,deflate" http://127.0.0.1:3000 

我们会看到采用了 GZip 后,输出的是乱码的,也不难看出,短了不少~这样就代表 GZip 设置成功了!

或者我们通过下面查看服务器response 信息来确认是否启用gzip

1
$ curl --head -H "Accept-Encoding: gzip,deflate" http://127.0.0.1:3000

也可以通过firebug这种浏览器工具来查看。

那该怎么用呢?

刚刚测试的时候其实都说明了:只需要在 request header 里面注明Acc-Encoding: gzip, deflate即可。其实说白了,是否用 GZip 压缩,还是客户端决定,客户端要非压缩的数据,服务器就给非压缩的数据;客户端要压缩的数据,服务器就给压缩的数据。默认当然是不压缩啦。

那在 iOS 上该如何用呢?

以 ASIHTTPRequest 为例:

1
2
request = [ASIHTTPRequest requestWithURL:...]; [request setAllowCompressedResponse:YES]; 

请求的时候设置allowCompressedResponseYES即可。

可能遇到的问题:

如果服务器返回的不是 JSON 等数据,而是企图下载文件,且客户端依然请求 GZip,还是会被压缩(虽然这个压缩可能会越压越大)。强制不压缩,就是忽略那个 request header,可以这么做:

1
2
3
4
5
def check_update_data  send_file(file, :x_sendfile => true)  headers['Content-Length'] = File.size(file)  request.env['HTTP_ACCEPT_ENCODING'] = nil end 

HTTP_ACCEPT_ENCODING设置为nil即可。

你可能感兴趣的:(Rails 支持 Response 数据 GZip 压缩 json)