【问题标题】:GZip encoding in Jersey泽西岛的 GZip 编码
【发布时间】:2019-03-28 17:44:39
【问题描述】:

我正在 Jersey 2 中编写一个 RESTful Web 服务。我想支持响应的 Gzip 编码。在this answer 之后,我在ResourceConfig 类中启用了org.glassfish.jersey.server.filter.EncodingFilter。

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标头。

我在Tomcat 9 上使用Jersey 2.27。

我还缺少其他配置吗?如何获取这两个标头并将响应作为 gzip 压缩而不是接收分块响应?

编辑:我注意到当我发送大文件 (> 1000 KB) 时,我会同时收到 Content-Encoding: gzip 和 Transfer-Encoding: chunked 标头。

【问题讨论】:

  • 我认为MyWebService 没有被容器接收。您是从web.xml 加载它,如this answer 所示? --- 尝试在第一个register(...) 调用上放置一个断点,看看它是否正在执行。如果是,则在 EncodingFilter 类中的 filter(...) 开头放置一个断点,然后逐步查看它是否应用了 gzip 编码。

标签: java jersey jax-rs


【解决方案1】:

是否使用Transfer-Encoding 或Content-Length 完全由容器自行决定。这取决于允许的缓冲区大小。

如果容器要设置Content-Length header,它必须事先知道压缩响应的长度,因此,容器必须将整个响应缓存在内存中。

对于泽西岛,内容长度缓冲区大小由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);

    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2017-05-13
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多