Могу ли я сжимать HTTP-запросы с помощью GZIP? - PullRequest
16 голосов
/ 20 сентября 2009

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

Ответы [ 4 ]

18 голосов
/ 20 сентября 2009

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

На стороне 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"
... />
4 голосов
/ 20 сентября 2009

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

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

2 голосов
/ 20 сентября 2009

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

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

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

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

1 голос
/ 20 сентября 2009

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

...