Search code examples
jax-rsjersey-client

How to enable gzip compression for content encoding with Jersey (JAX-RS 2.0) client?


I have a Java application that uses the Jersey implementation of JAX-RS 2.0 and I want to enable gzip compression on the client side. The server has it enabled and I have verified that by looking in Chrome at the "Size/Content" in the Developer Tools for the specific URL the client is using.

I see a lot of information and documentation floating around the web about setting the HTTP Headers with filters and decoding response bodies with interceptors and I cannot decipher what I actually need to code in the client.

I have this code:

private synchronized void initialize() {
    Client client = ClientBuilder.newClient();
    client.register(new HttpBasicAuthFilter(username, password));
    WebTarget targetBase = client.target(getBaseUrl());
    ...
}

What should I add to enable compression?


Solution

  • Modify to look like:

    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");
        ...
    }
    

    In this example, there are some fields and methods being referenced that I don't include in the example (such as MEDIA_TYPE), you'll have to figure those out yourself. Should be pretty straight forward.

    I verified this worked by analyzing the response headers and monitoring the application network usage. I got a 10:1 compression ratio according to the network usage checks I did. That seems about right, yay!