gpt4 book ai didi

java - Jersey 的 GZip 编码

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:13 24 4
gpt4 key购买 nike

我正在 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 时,我得到了一个响应,但响应 header 不包含 Content-Encoding header ,而是包含 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 header ,也没有任何Content-Length header 。

我在 Tomcat 9 上使用 Jersey 2.27

我还缺少任何其他配置吗?我如何获得这两个 header 并获得 gzip 压缩的响应而不是接收分块响应?

编辑:我注意到当我发送大文件(> 1000 KB)时,我同时获得了Content-Encoding: gzipTransfer-Encoding:分块的 header 。

最佳答案

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

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

对于 Jersey,内容长度缓冲区大小由 ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER 定义。默认情况下,这是 8192 字节

您可以轻松地从您的 MyWebService 类增加它:

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

...

property(ServerProperties.OUTBOUND_CONTENT_LENGTH_BUFFER, 32768);

}
}

希望这对您有所帮助。

关于java - Jersey 的 GZip 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com