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即可。

阅读更多
换一批

没有更多推荐了,返回首页