Кодировка GZip на Джерси - PullRequest
3 голосов
/ 28 марта 2019

Я пишу веб-сервис RESTful в Джерси 2. Я хочу поддержать кодировку Gzip для ответов.После этого ответа я включил org.glassfish.jersey.server.filter.EncodingFilter в своем классе ResourceConfig.

public class MyWebService extends ResourceConfig {
    public MyWebService() {
        register(EncodingFilter.class);
        register(GZipEncoder.class);
        register(DeflateEncoder.class);
    }
}

В своем классе ресурсов я возвращаю объект javax.ws.rs.core.Response.

@GET
@Path("api/configs") 
public Response listConfigs() throws Exception {
    List<UserConfig> configs = configService.getAll();
    return Response.ok().entity(configs).build();
}

Теперь, когда я нажимаю на этот API, я получаю ответ, но заголовки ответа не содержат заголовок Content-Encoding, скорее он содержит Transfer-Encoding: chunked.

Запрос:

> GET /api/configs HTTP/1.1
> Accept-Encoding: gzip

Ответ:

> HTTP/1.1 200 
> Transfer-Encoding: chunked
* Received 14.8 KB chunk
* Received 504 B chunk
* Received 15.2 KB chunk
* Received 506 B chunk
* Received 15.1 KB chunk
* Received 514 B chunk

В ответе нет ни заголовка Content-Encoding: gzip, ни заголовка Content-Length.

Я использую Jersey 2.27 on Tomcat 9.

Есть ли какая-то другая конфигурация, которую я пропускаю?Как получить эти два заголовка и получить ответ в виде сжатого gzip вместо получения фрагментированного ответа?

Редактировать : я заметил, что при отправке больших файлов (> 1000 КБ) я получаюзаголовки Content-Encoding: gzip и Transfer-Encoding: chunked.

1 Ответ

1 голос
/ 07 апреля 2019

Использовать ли Transfer-Encoding или Content-Length полностью на усмотрение контейнера.Это зависит от разрешенного размера буфера.

Если контейнер должен установить заголовок Content-Length, он должен заранее знать длину сжатого ответа, поэтому контейнер должен буферизовать весь ответ вобъем памяти.

В случае Джерси размер буфера длины контента определяется как ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER.По умолчанию это 8192 bytes.

Вы можете легко увеличить это значение из своего MyWebService класса:

public class MyWebService extends ResourceConfig {
    public MyWebService() {
        register(EncodingFilter.class);
        register(GZipEncoder.class);
        register(DeflateEncoder.class);

        ...

        property(ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER, 32768);

    }
}

Надеюсь, это поможет.

...