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

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)

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

Jay*_*yen 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());
    ...
}
Run Code Online (Sandbox Code Playgroud)

和@Jason几乎一样,但是为我EncodingFilter检测了GzipEncoder.


Jas*_*son 5

修改成这样:

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 的压缩比。这似乎是对的,耶!

  • @Vincent 是什么版本的 Jersey?如果没有`EncodingFilter`,我的就不会这样做。 (2认同)

Kha*_*111 5

在我的示例(使用 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”添加一个属性。