Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

На стороне 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

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

<Connector 
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,application/json"
... />

Ответ 2

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

EDIT: обратная сторона этого заключается в том, что нет гарантии, что сторона HTTP-сервера примет какой-либо конкретный формат сжатия. И в зависимости от качества серверной реализации HTTP он может даже не признать, что содержимое запроса сжато. Поэтому вы не хотите этого делать, если не знаете, что серверная сторона поддерживает сжатый контент запроса.

Ответ 3

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

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

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

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

Ответ 4

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