Я запускаю Rails 3.2.7 с Ruby 1.9.3p194 для вывода данных JSON из базы данных SQLite.
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 следующим образом:
ActiveSupport::Gzip.compress(result)
Я также предполагаю из HTTP/1.1, RFC2626, раздел 14.3 , что могу настроить заголовок HTTP-запроса:
httpPost.setHeader("Accept-Encoding", "gzip");
Я также нашел довольно интересной информацию, содержащуюся в разделе 3.5 «Коды контента» :
- 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].
. В этом посте далее объясняется , как обрабатывать контент, закодированный GZIP, с помощью Android .
Таким образом, я понятия не имею, как я могу узнать, были ли данные сжаты сервером. Чтобы проверить, выводит ли Rails gzip,Я пытался использовать curl , как было предложено здесь:
$ 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 --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 , упомянутый здесь . Он подтвердил, что содержимое JSON «не сжато». Второй веб-сайт GIDZipTest , связанный здесь , подтвердил отрицательный результат теста.
Как я узнал, все, что мне нужно настроить для сервера 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
.