Комуникирам към сървър 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, помислете за възможността да поставите екземпляр на Apache HTTP сървър пред сървъра Tomcat.
Това може да стане с помощта на модула mod_jk за HTTP сървър на Apache. След като направите това, можете да използвате mod_gzip/mod_deflate в Apache.
Разбира се, вашият клиент трябва да има способността да обработва компресираните отговори, за да работи това. Ако принудите клиента си да работи с компресирани отговори, клиентът в крайна сметка ще покаже безсмислици, тъй като (обикновено) би очаквал отговори в обикновен текст. Ще намерите категоричния индикатор за способността на клиента да обработва компресирани отговори в заглавките Accept-Encoding на клиента.
Това може да се направи програмно, като се използва сървлет или сервлет филтър, който записва в ZipOutputStream или GZipOutputStream, ако искате да избегнете въвеждането на Apache HTTP сървър в мрежата. Ще намерите някои указания за как да направите това в OReilly OnJava .com сайт.