如何在 Rails for Android 中使用 gzip 压缩 JSON?

2024-06-29

我正在运行 Rails 3.2.7 和 Ruby 1.9.3p194,以从 SQLite 数据库输出 JSON 数据。

render :json => result.to_json

Android 应用程序使用通过以下方式加载的 JSON 文件HTTP-GET:

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(urlPath);
HttpResponse response = httpclient.execute(httpGet);
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, HTTP.UTF_8);
JSONObject jsonObject = new JSONObject(result);

平台支持:

我在 API 中读到Rails 提供 gzip 支持 http://api.rubyonrails.org/classes/ActiveSupport/Gzip.html如下:

ActiveSupport::Gzip.compress(result)

我也猜测来自HTTP/1.1,RFC2626,第 14.3 节 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3我可以配置 HTTP 请求的标头:

httpPost.setHeader("Accept-Encoding", "gzip");

我还发现其中包含的信息非常有趣第 3.5 节“内容编码” http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5:

  • 所有内容编码值都是不区分大小写.
  • HTTP/1.1 使用内容编码值接受编码(第 14.3 节)和内容编码(第 14.11 节)标头字段。
  • The Internet Assigned Numbers Authority (IANA) acts as a registry for content-coding value tokens. Initially, the registry contains the following tokens:
    • gzip由文件压缩程序“gzip”(GNU zip)生成的编码格式,如 RFC 1952 [25] 中所述。

这篇文章进一步解释了如何使用 Android 处理 GZIP 编码内容 https://stackoverflow.com/a/1576513/356895.

服务器测试:

因此,我不知道如何知道数据是否已被服务器压缩。 为了测试 Rails 是否输出 gzip,我尝试使用curl按照建议here https://stackoverflow.com/a/251012/356895:

$ curl --head -H "Accept-Encoding: gzip" http://localhost:3000/posts.json

然而,输出并没有告诉我是否支持 gzip:

HTTP/1.1 200 OK 
Content-Type: application/json; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "f6f6732c747466f75052f88b1eff393b"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 74ee0562c05adea679deb701f1b8fd88
X-Runtime: 0.004205
Content-Length: 0
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Thu, 16 Aug 2012 23:33:25 GMT
Connection: Keep-Alive

我也尝试过--compressed的参数curl http://curl.haxx.se/docs/manpage.html ...

$ curl --compressed --head -H "Accept-Encoding: gzip" http://localhost:3000/posts.json

它输出与前一个命令相同的头信息。当我跑...

$ curl --compressed -H "Accept-Encoding: gzip" http://localhost:3000/posts.json

JSON 数据作为可读文本打印到控制台。我看不到压缩是否发生。或许,因为curl已经解压响应了?!

在线测试

我也尝试过在线测试HTTP压缩测试 http://www.whatsmyip.org/http-compression-test/提及here https://webmasters.stackexchange.com/a/543。它确认 JSON 内容“未经过 gzip 压缩”。第二个网站GIDZip测试 http://www.gidnetwork.com/tools/gzip-test.php linked here https://webmasters.stackexchange.com/a/4613承认检测结果呈阴性。

问题:

  1. 如何从 Rails 输出 gzip 压缩的 JSON?
  2. 如何配置 HTTP 客户端来请求 gzip 压缩数据?
  3. 当我在 Heroku (PostgreSQL) 上运行 Rails 服务器时,相同的配置是否仍然有效,...?

得到教训

据我所知,我必须为 REST 服务器配置的所有内容是use Rack::Deflater。需要明确的是:我不使用ActiveSupport::Gzip.compress()在我的代码中。如果有人感兴趣,这就是启用 GZIP 压缩时标头的样子。

HTTP/1.1 200 OK 
Content-Type: application/json; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "8170a04be41673bf25824256740a9460"
Cache-Control: max-age=0, private, must-revalidate
X-Request-Id: 700b9536f6a20164d31b8528bde423af
X-Runtime: 0.369337
Vary: Accept-Encoding
Content-Encoding: gzip
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-04-20)
Date: Tue, 21 Aug 2012 12:10:48 GMT
Content-Length: 20
Connection: Keep-Alive

现在我知道了神奇的关键字,很容易搜索并查找有关的文章use Rack::Deflater http://bit.ly/PtAmzg.


也许你应该使用 Rack::Deflater? 在 config.ru 中插入:

require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Deflater
run MyAppName::Application

并配置您的 http 请求标头:

我可以配置 HTTP 请求的标头:

httpPost.setHeader("接受编码", "gzip");

附:相同的配置适用于 Heroku

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Rails for Android 中使用 gzip 压缩 JSON? 的相关文章

随机推荐

  • xamarin 中的本机链接错误

    我今天尝试编译我的 xamarin 项目 突然收到以下错误 错误 MT5210 本机链接失败 未定义符号 mono handle global vregs 请验证是否已引用所有必要的框架并且本机库是否正确 链接到 错误 MT5210 本机链
  • dask分布式内存错误

    在分布式作业上运行 Dask 时 我在调度程序上遇到以下错误 distributed core ERROR Traceback most recent call last File usr local lib python3 4 dist
  • 使用 SQLAlchemy 查询 Pandas DataFrame 时重命名列

    当您将数据查询到 pandas 数据帧时 有没有办法保留 SqlAlchemy 属性名称 这是我的数据库的简单映射 对于 school 表 我将数据库名称 SchoolDistrict 重命名为较短的 district 我从 DBA 中删除
  • 不要自动切换到更高端的独立GPU

    正如本文所写技术问答 http developer apple com library mac qa qa1734 index html 默认情况下 一旦您的应用程序创建了 OpenGL 上下文 通过 直接调用OpenGL或依赖OpenGL
  • vue基于媒体查询绑定值

    carousel 3d display 3 width 150 height 150 我想根据媒体查询设置属性绑定 e g 当屏幕宽度 gt 960px 时 显示应变为 5 您可以尝试绑定display组件属性的值
  • 如何在cj api中根据类别检索产品目录?

    我正在使用 CJ API 我们需要根据类别检索所有产品目录 任何人使用过此类概念请与我分享 更新答案我编写的一个小脚本 用于在 Commission Junction 测试 REST API PHP代码
  • Java 1.8 和 tomcat 6.0.53 引起:java.io.EOFException:SSL 对等点错误关闭

    java cp catalina jar org apache catalina util ServerInfo Server version Apache Tomcat 6 0 53 Server built Apr 19 2017 22
  • 将渐变应用于 UIImage - 如何消除颜色反转?

    我正在应用渐变UIImage 我希望它底部是黑色的 中间慢慢变成透明或浅灰色 基本上没问题 但我有一个问题 在这个渐变下 我的图像颜色在某些地方反转 这看起来很烦人 我该如何解决这个问题 为了您方便 我的方法如下 我尝试过选择不同的混合模式
  • 微融合和寻址模式

    我发现了一些意想不到的东西 对我来说 使用英特尔 架构代码分析器 https software intel com en us articles intel architecture code analyzer IACA 以下指令使用 ba
  • 将 WPF 属性数据绑定到变量

    我有一个 WPF 4 和 VB net 2010 中的项目 我想将媒体元素的音量属性绑定到另一个模块中的变量 请注意 变量的数据类型正确 因此无需转换 我该怎么做呢 首先 确保您的后台代码实现了 INotifyPropertyChanged
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 适用于标准类兼容 USB 设备的 Android USB 主机模式“软模式”驱动程序

    现在既然Android API 支持直接使用 USB 设备 http developer android com guide topics connectivity usb host html 自 3 1 起 我很好奇是否有任何工作可以为一
  • 导入tensorflow模块在tensorflow 2中很慢

    有关的 导入 TensorFlow contrib 模块在 TensorFlow 1 2 1 中速度很慢 https stackoverflow com questions 45093653 import tensorflow contri
  • 如何匹配宏中的特征边界?

    我正在尝试匹配泛型类型的特征边界 macro rules test where bounded type ident bound tt gt Dummy expansion for test struct Foo
  • android项目中视频文件放在哪里

    我有一个视频 我需要知道放置在哪里以及如何获取该视频的路径 我知道如何从 URL 添加视频 Uri uri Uri parse www abc com myVid mp4 videoView VideoView findViewById R
  • 为基于 pom.xml 的存储库设置目标平台

    在 Tycho 中 有两种定义目标平台的方法 目标文件和
  • 带有华丽弹出窗口的多个画廊

    我正在尝试使用 Magnific Popup jQuery 插件创建一个包含一些画廊的页面 我包含在不同的部分divs 具有单独的 id 和 gallery包含图像的类 div p Some content p div class gall
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 如何在 Rails for Android 中使用 gzip 压缩 JSON?

    我正在运行 Rails 3 2 7 和 Ruby 1 9 3p194 以从 SQLite 数据库输出 JSON 数据 render json gt result to json Android 应用程序使用通过以下方式加载的 JSON 文件