Как сжать JSON с помощью gzip в Rails для Android?

Я запускаю 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 , связанный здесь , подтвердил отрицательный результат теста.

Вопросы:

  1. Как я могу вывести сжатый gzip JSON из Rails?
  2. Как настроить HTTP-клиент для запроса данных, сжатых gzip?
  3. Работает ли та же конфигурация, когда я запускаю сервер Rails на Heroku (PostgreSQL ),...?

Извлеченные уроки

Как я узнал, все, что мне нужно настроить для сервера 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.

7
задан Community 23 May 2017 в 12:25
поделиться