gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:52 28 4
gpt4 key购买 nike

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

render :json => result.to_json

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

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 offers gzip support如下:

ActiveSupport::Gzip.compress(result)

我也是从HTTP/1.1, RFC2626, section 14.3猜的我可以配置 HTTP 请求的 header :

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

我还发现 section 3.5 "Content Codings" 中包含的信息非常有趣:

  • All content-coding values are case-insensitive.
  • HTTP/1.1 uses content-coding values in the Accept-Encoding (section 14.3) and Content-Encoding (section 14.11) header fields.
  • The Internet Assigned Numbers Authority (IANA) acts as a registry for content-coding value tokens. Initially, the registry contains the following tokens:
    • gzip An encoding format produced by the file compression program "gzip" (GNU zip) as described in RFC 1952 [25].

这篇文章进一步解释了how to handle GZIP encoded content with Android .

服务器测试:

因此,我不知道如何才能知道数据是否已被服务器压缩。为了测试 Rails 是否输出 gzip,我尝试按照建议使用 curl here :

$ 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

我还尝试了 curl--compressed 参数...

$ 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 Compression Test提到here .它确认 JSON 内容“未压缩”。第二网站GIDZipTest链接here承认阴性检测结果。

问题:

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

经验教训

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

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

现在我知道了魔法关键字,很容易search and find articles on use Rack::Deflater .

最佳答案

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

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

并配置您的 http 请求 header :

I can configure the header of a HTTP request:

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

附言相同的配置适用于 Heroku

关于android - 如何在 Rails for Android 中使用 gzip 压缩 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11997110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com