我有一个使用JAX-RS 2.0的Jersey实现的Java应用程序,我想在客户端启用gzip压缩。服务器已启用它,我已通过在开发者工具中的“大小/内容”中查看客户端正在使用的特定URL的Chrome验证。
我看到网上有很多关于使用过滤器设置HTTP标头和使用拦截器解码响应主体的信息和文档,我无法破译我在客户端实际需要编码的内容。
我有这段代码:
private synchronized void initialize() {
Client client = ClientBuilder.newClient();
client.register(new HttpBasicAuthFilter(username, password));
WebTarget targetBase = client.target(getBaseUrl());
...
}
我应该添加什么来启用压缩?
答案 0 :(得分:7)
设法做到了:
private synchronized void initialize() {
Client client = ClientBuilder.newClient();
client.register(new HttpBasicAuthFilter(username, password));
client.register(GZipEncoder.class);
client.register(EncodingFilter.class);
WebTarget targetBase = client.target(getBaseUrl());
...
}
与@Jason几乎相同,但EncodingFilter
为我检测到GzipEncoder
。
答案 1 :(得分:4)
修改为:
private synchronized void initialize() {
Client client = ClientBuilder.newClient();
client.register(new HttpBasicAuthFilter(username, password));
client.register(GZipEncoder.class);
WebTarget targetBase = client.target(getBaseUrl());
...
// new lines here:
Invocation.Builder request = targetBase.request(MEDIA_TYPE);
request.header(HttpHeaders.ACCEPT_ENCODING, "gzip");
...
}
在这个示例中,有一些字段和方法被引用,我不会在示例中包含这些字段和方法(例如MEDIA_TYPE
),您必须自己解决这些问题。应该很直接。
我通过分析响应标头和监控应用程序网络使用情况验证了这一点。根据我做的网络使用情况检查,我得到了10:1的压缩比。这似乎是对的,耶!
答案 2 :(得分:4)
在我的示例中(使用JAX RS 2.x)和使用多部分的Jersey,以上都没有,但是这样做了:
Client client = ClientBuilder.newBuilder()
.register(EncodingFilter.class)
.register(GZipEncoder.class)
.property(ClientProperties.USE_ENCODING, "gzip")
.register(MultiPartFeature.class)
.register(LoggingFilter.class)
.build();
基本上与上述答案相同,但必须为“gzip”添加一个属性。
答案 3 :(得分:0)
您可以直接使用EncodingFilter
,而不是分别注册GZipEncoder
和EncodingFeature
。在Jersey 2.32中,我遇到了注入不完整以及否则会导致NullPointerExceptions的问题。
Client client = ClientBuilder.newClient();
client.register(new EncodingFeature("gzip", GZipEncoder.class));
client.register(new HttpBasicAuthFilter(username, password));
WebTarget targetBase = client.target(getBaseUrl());
请注意,设置useEncoding
参数的区别
client.register(new EncodingFeature("gzip", GZipEncoder.class));
还是不
client.register(new EncodingFeature(GZipEncoder.class));
是如果客户端的初始请求已经使用gzip编码,或者仅向服务器指示它将理解压缩的答复。