Jas*_*son 7 jax-rs jersey-client
我有一个使用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());
...
}
Run Code Online (Sandbox Code Playgroud)
我应该添加什么来启用压缩?
设法做到:
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());
...
}
Run Code Online (Sandbox Code Playgroud)
和@Jason几乎一样,但是为我EncodingFilter检测了GzipEncoder.
修改成这样:
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");
...
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,引用了一些我未包含在示例中的字段和方法(例如MEDIA_TYPE),您必须自己弄清楚。应该很直接。
我通过分析响应标头和监控应用程序网络使用情况来验证这一点。根据我所做的网络使用情况检查,我得到了 10:1 的压缩比。这似乎是对的,耶!
在我的示例(使用 JAX RS 2.x)和使用 multipart 的 Jersey 中,上述方法均无效,但这样做了:
Client client = ClientBuilder.newBuilder()
.register(EncodingFilter.class)
.register(GZipEncoder.class)
.property(ClientProperties.USE_ENCODING, "gzip")
.register(MultiPartFeature.class)
.register(LoggingFilter.class)
.build();
Run Code Online (Sandbox Code Playgroud)
与上述答案基本相同,但必须为“gzip”添加一个属性。