Мога ли да компресирам 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
Както казва Stephen C, това ще компресира ли само данните или също 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, помислете за възможността да поставите екземпляр на Apache HTTP сървър пред сървъра Tomcat.

Това може да стане с помощта на модула mod_jk за HTTP сървър на Apache. След като направите това, можете да използвате mod_gzip/mod_deflate в Apache.

Разбира се, вашият клиент трябва да има способността да обработва компресираните отговори, за да работи това. Ако принудите клиента си да работи с компресирани отговори, клиентът в крайна сметка ще покаже безсмислици, тъй като (обикновено) би очаквал отговори в обикновен текст. Ще намерите категоричния индикатор за способността на клиента да обработва компресирани отговори в заглавките Accept-Encoding на клиента.

Това може да се направи програмно, като се използва сървлет или сервлет филтър, който записва в ZipOutputStream или GZipOutputStream, ако искате да избегнете въвеждането на Apache HTTP сървър в мрежата. Ще намерите някои указания за как да направите това в 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 сървъра спрямо сървъра на приложения - разпределение на натоварването на сървъра. Човек не би искал сървърът на приложения да бъде обременен с компресиране на отговор, освен обичайната задача за изпълнение на логиката на приложението. Освен това Apache HTTP сървърът има много по-добри характеристики на производителност от Tomcat. - person Vineet Reynolds; 20.09.2009

От страната на сървъра можете да го активирате, както е описано тук, но мобилното приложение ще се нуждае от библиотека, която може да декомпресира gzip, като например този. Може да е малко работа, за да работи все пак...

person Mark K    schedule 20.09.2009