Можно ли включить http-сжатие для запросов?
Я вижу много информации о включении сжатия HTTP для ответов сервера, но как насчет входящих запросов. Разве для браузеров не имеет смысла сжимать большие сообщения в форме перед отправкой на сервер?
Другим примером является веб-сервис REST, который мы используем. Мы должны отправлять частые запросы PUT с большими файлами XML (более 10 МБ) и определенно увидим некоторые преимущества пропускной способности / скорости с обеих сторон.
Так это решаемая проблема на стороне сервера или каждое веб-приложение должно обрабатывать ее индивидуально?
4 ответа
К PUT сжатые данные на сервер, вы должны сжать тело запроса и установить Content-Encoding: gzip заголовок. Сам заголовок должен быть несжатым. Это задокументировано в mod_deflate:
Модуль mod_deflate также предоставляет фильтр для распаковки тела сжатого gzip запроса. Чтобы активировать эту функцию, вы должны вставить фильтр DEFLATE в цепочку входных фильтров, используя SetInputFilter или AddInputFilter.
...
Теперь, если запрос содержит заголовок Content-Encoding: gzip, тело будет автоматически распаковано. Лишь немногие браузеры имеют возможность gzip тела запросов. Однако некоторые специальные приложения действительно поддерживают сжатие запросов, например некоторые клиенты WebDAV.
И статья, описывающая это здесь:
Итак, как вы это делаете? Вот реклама, опять же из исходного кода mod_deflate: работа только по основному запросу / без подзапросов. Это означает, что все тело запроса должно быть сжато gzip, если мы решили использовать это, невозможно сжать только часть, содержащую файл, например, в составном запросе.
Отдельно браузер может запросить сжатие содержимого ответа сервера, установив Accept-Encoding заголовок согласно здесь:
GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0
Это вернет сжатые данные в браузер.
Отвечая на часть о сжатых запросах, а не ответах: да, это возможно, даже если это не кажется широко распространенным. Клиентское приложение должно установить соответствующий заголовок кодировки содержимого. Что касается серверного приложения, есть 2 варианта:
приложение поддерживает повторную разгрузку тела запроса самостоятельно. Библиотека примеров, которая может сделать это, является phpxmlrpc.
веб-сервер раздувает тело ответа перед передачей его в приложение. Это возможно с помощью фильтра mod_deflate Apache и настройки inputFilter
Не из любого браузера, о котором я знаю, вам нужно найти плагин, который сделает это за вас. По сути, вы должны установить HTTP-заголовок с кодировкой содержимого, чтобы сервер знал, как поступает запрос. Разумеется, сервер должен уметь обрабатывать эту кодировку.
Ниже код настраивает настраиваемый заголовок и передает этот заголовок в вызове API как параметры http:
getCustomHeaders() {
return new HttpHeaders({
'Accept-Encoding': 'gzip, deflate'
});
}
После этого, пока вы вызываете API для получения данных, передайте параметры с url:
searchData(title: string, type: SearchType): Observable<any> {
const headersSpl = this.getCustomHeaders();
const httpOptions = {
headers : headersSpl
};
const url = `${this.url}?s=${encodeURI(title)}&type=${type}&apiKey=${this.apiKey}`;
return this.httpClient.get(url, httpOptions)
.pipe(
map( results => results['data']),
catchError( error => { console.log(error); return EMPTY })
)
}
Это НЕ разрешено. Согласно спецификации HTTP (RFC 2616), Content-Encoding НЕ является одним из возможных полей заголовка запроса, поэтому сжатие тела объекта запроса невозможно, поскольку нет законного способа сообщить серверу, что это произошло. Любое сжатие тела запроса выполняется только как нестандартное расширение.