Назад | Перейти на главную страницу

Можно ли включить HTTP-сжатие для запросов?

Я вижу много информации о включении HTTP-сжатия для ответов сервера, но как насчет входящих запросов. Разве браузерам не имеет смысла сжимать сообщения большой формы перед их отправкой на сервер?

Другой пример - это используемый нами веб-сервис REST. Мы должны часто отправлять запросы PUT с большими XML-файлами (10+ МБ), и мы определенно увидим некоторые преимущества полосы пропускания / скорости с обеих сторон.

Так это решенная проблема на стороне сервера или каждое веб-приложение должно решать ее индивидуально?

Чтобы PUT данные на сервер сжаты, вы должны сжать тело запроса и установить Content-Encoding: gzip заголовок. Сам заголовок должен быть несжатым. Это задокументировано в mod_deflate:

Модуль mod_deflate также предоставляет фильтр для распаковки тела запроса, сжатого с помощью gzip. Чтобы активировать эту функцию, вы должны вставить фильтр DEFLATE в цепочку входных фильтров с помощью SetInputFilter или AddInputFilter.

...

Теперь, если запрос содержит заголовок Content-Encoding: 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 варианта:

  1. приложение поддерживает повторное заполнение тела запроса самостоятельно. Пример библиотеки, которая может это сделать, - phpxmlrpc.

  2. веб-сервер раздувает тело ответа перед передачей его приложению. Это возможно с помощью, например, фильтр 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 НЕ является одним из возможных полей заголовка запроса, поэтому невозможно сжать тело объекта запроса, поскольку нет законного способа сообщить серверу, что это произошло. Любое сжатие тела запроса выполняется только как нестандартное расширение.