Я взаимодействую с сервером Tomcat с помощью приложения Java ME на своем мобильном устройстве.
Мне было интересно, могу ли я сжимать свои запросы/ответы с помощью Gzip, чтобы уменьшить количество байтов, отправляемых по сети.
Могу ли я сжимать HTTP-запросы с помощью GZIP?
Ответы (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"
... />
Вы можете сжать содержимое HTTP-запроса или ответа, но не заголовки. См. раздел 3.6 спецификации HTTP 1.1 и более поздний раздел, в котором описывается заголовок Content-Encoding.
РЕДАКТИРОВАТЬ: обратная сторона этого заключается в том, что нет гарантии, что сторона HTTP-сервера примет какой-либо конкретный формат сжатия. И в зависимости от качества реализации HTTP на стороне сервера он может даже не распознать, что содержимое запроса было сжато. Поэтому вы не хотите этого делать, если не знаете, что серверная часть поддерживает сжатый контент запроса.
Поскольку вы используете Tomcat, рассмотрите возможность размещения экземпляра HTTP-сервера Apache перед сервером Tomcat.
Это можно сделать с помощью модуля mod_jk для HTTP-сервера Apache. Сделав это, вы можете использовать mod_gzip/mod_deflate в Apache.
Конечно, ваш клиент должен иметь возможность обрабатывать сжатые ответы, чтобы это работало. Если вы заставите своего клиента работать со сжатыми ответами, клиент в конечном итоге будет отображать тарабарщину, поскольку он (обычно) ожидал бы ответов в виде простого текста. Вы найдете определенный индикатор способности клиента обрабатывать сжатые ответы в заголовках Accept-Encoding клиента.
Это можно сделать программно, используя сервлет или фильтр сервлетов, который записывает в ZipOutputStream или GZipOutputStream, если вы хотите избежать появления HTTP-сервера Apache в сети. Вы найдете несколько советов о том, как это сделать на сайте OReilly OnJava. сайт .com.