【发布时间】: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编码。