Могу ли я сжимать HTTP-запросы с помощью GZIP?

Я взаимодействую с сервером Tomcat с помощью приложения Java ME на своем мобильном устройстве.
Мне было интересно, могу ли я сжимать свои запросы/ответы с помощью Gzip, чтобы уменьшить количество байтов, отправляемых по сети.


person Kevin Boyd    schedule 20.09.2009    source источник


Ответы (4)


Современные телефоны имеют так много мощности процессора, а сеть относительно медленная, поэтому сжатие имеет смысл. Это также довольно легко сделать.

На стороне J2ME вы делаете что-то вроде этого (при условии, что вы используете HttpConnection),

  hc.setRequestProperty("Accept-Encoding", "gzip, deflate");
  if (hc.getResponseCode() == HttpConnection.HTTP_OK) {
      InputStream in = hc.openInputStream();
      if ("gzip".equals(hc.getEncoding())) 
         in = new GZIPInputStream(in);
  ...

Мы используем GZIPInputStream от tinyline, но я уверен, что есть и другие,

http://www.tinyline.com/utils/index.html

На стороне сервера все встроено. Просто добавьте следующие атрибуты к соединителю в server.xml на Tomcat,

<Connector 
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,application/json"
... />
person ZZ Coder    schedule 20.09.2009
comment
Как говорит Стивен С, будет ли это сжимать только данные или заголовки HTTP? - person Kevin Boyd; 20.09.2009
comment
@Kevin, это не будет сжимать заголовки. Если заголовки должны быть сжаты, как клиент определит, как они были сжаты? GZIP — это всего лишь один из методов сжатия. - person Vineet Reynolds; 20.09.2009
comment
@Кевин. Это правильно. Заголовки не сжимаются с использованием основанного на стандартах HTTP. - person Stephen C; 20.09.2009
comment
Посмотрите на отправку только абсолютно необходимых заголовков. - person Thorbjørn Ravn Andersen; 20.09.2009
comment
Если вы сожмете заголовки, это будет уже не HTTP. Вы также можете сделать это, но вам понадобится компрессионный туннель. J2ME не поддерживает это, так что будет гораздо больше работы. - person ZZ Coder; 20.09.2009
comment
В лучшем случае это неполный ответ, потому что он не приводит к сжатию запроса, как того требует OP. - person user643011; 28.05.2013

Вы можете сжать содержимое HTTP-запроса или ответа, но не заголовки. См. раздел 3.6 спецификации HTTP 1.1 и более поздний раздел, в котором описывается заголовок Content-Encoding.

РЕДАКТИРОВАТЬ: обратная сторона этого заключается в том, что нет гарантии, что сторона HTTP-сервера примет какой-либо конкретный формат сжатия. И в зависимости от качества реализации HTTP на стороне сервера он может даже не распознать, что содержимое запроса было сжато. Поэтому вы не хотите этого делать, если не знаете, что серверная часть поддерживает сжатый контент запроса.

person Stephen C    schedule 20.09.2009

Поскольку вы используете Tomcat, рассмотрите возможность размещения экземпляра HTTP-сервера Apache перед сервером Tomcat.

Это можно сделать с помощью модуля mod_jk для HTTP-сервера Apache. Сделав это, вы можете использовать mod_gzip/mod_deflate в Apache.

Конечно, ваш клиент должен иметь возможность обрабатывать сжатые ответы, чтобы это работало. Если вы заставите своего клиента работать со сжатыми ответами, клиент в конечном итоге будет отображать тарабарщину, поскольку он (обычно) ожидал бы ответов в виде простого текста. Вы найдете определенный индикатор способности клиента обрабатывать сжатые ответы в заголовках Accept-Encoding клиента.

Это можно сделать программно, используя сервлет или фильтр сервлетов, который записывает в ZipOutputStream или GZipOutputStream, если вы хотите избежать появления HTTP-сервера Apache в сети. Вы найдете несколько советов о том, как это сделать на сайте OReilly OnJava. сайт .com.

person Vineet Reynolds    schedule 20.09.2009
comment
Вы можете выполнять сжатие gzip в Tomcat без добавления Apache. Посмотрите на атрибут сжатия HTTP-коннектора: http://tomcat.apache.org/tomcat-5.5-doc/config/http.html - person Taylor Leese; 20.09.2009
comment
Да, я знаю, но есть причина, по которой сжатие делается на HTTP-сервере, а не на сервере приложений - распределение нагрузки на сервер. Никто не хотел бы, чтобы сервер приложений был обременен сжатием ответов, помимо его обычной задачи по запуску логики приложения. Кроме того, HTTP-сервер Apache имеет гораздо лучшие характеристики производительности, чем Tomcat. - person Vineet Reynolds; 20.09.2009

На стороне сервера вы можете включить его, как описано здесь., но для мобильного приложения потребуется библиотека, которая может распаковывать gzip, например этот. Хотя, возможно, придется немного потрудиться, чтобы заставить его работать...

person Mark K    schedule 20.09.2009