如何使用Jersey(JAX-RS 2.0)客户端为内容编码启用gzip压缩?

时间:2014-03-19 22:37:59

标签: 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());
    ...
}

我应该添加什么来启用压缩?

4 个答案:

答案 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,而不是分别注册GZipEncoderEncodingFeature。在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编码,或者仅向服务器指示它将理解压缩的答复。