Andres Olarte
Andres Olarte

Reputation: 4380

Enable gzip compression in CXF client

I'm trying to make my client use gzip. I have the GZip Feature enabled in the server. It seems that the client it's not sending the correct header:

POST /api/v1/data HTTP/1.1
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction: ""
User-Agent: Apache CXF 2.6.2
Cache-Control: no-cache
Pragma: no-cache
Host: localhost:8001
Connection: keep-alive
Content-Length: 539

Here's the code where I create the client:

 private static final QName SERVICE_NAME = new QName(
            "http://xxx/", "IData");
    private static final QName PORT_NAME = new QName(
            "http://xxx/", "IDataPort");
    IData port;

    public void initPort() {
        Service service = Service.create(SERVICE_NAME);
        // Endpoint Address
        String endpointAddress = ClientUtil.getUrl()
                + "data";

        // Add a port to the Service
        service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
                endpointAddress);

        port = service.getPort(IData.class);
    }

The IData interface implements has the GZip Annotation:

@WebService
@GZIP
public interface IData ....

Upvotes: 8

Views: 11656

Answers (5)

Ram
Ram

Reputation: 171

more detailed answer to above mentioned answer

Client client = ClientProxy.getClient(port);

//this line to send compressed(gzip) request to server
client.getOutInterceptors().add(new GZIPOutInterceptor());

//this in to uncompress server response at client side
client.getInInterceptors().add(new GZIPInInterceptor());

Upvotes: 0

kolobok_ua
kolobok_ua

Reputation: 4210

The easiest way to enable gzip:

List<Feature> features = Arrays.asList(new GZIPFeature())
final WebClient webClient = WebClient.create(uri, null, features, null);

GZipFeature will automatically add "in interceptor", "out interceptor" and "out fault interceptor".

Upvotes: 1

jmattheis
jmattheis

Reputation: 11135

When only gzip'in the response from the server and not the the request from the client, then you need to add the header and the GZIPInInterceptor like to following:

// add accept-encoding header
Map<String, Object> requestHeaders = new HashMap<>();
requestHeaders.put("Accept-Encoding", new ArrayList<>(Arrays.asList("gzip")));
((BindingProvider)service).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, requestHeaders);

// encode response from server
client.getInInterceptors().add(new GZIPInInterceptor());

Upvotes: 1

JackDev
JackDev

Reputation: 11183

As I understand from http://fusesource.com/docs/esb/4.4/cxf_jaxws/JavaFirst-AnnotateCxf-Compress.html

"GZIP is a negotiated enhancement. That is, an initial request from a client will not be gzipped, but an Accept header will be added and, if the server supports GZIP compression, the response will be gzipped and any subsequent requests will be also."

Check if the web service accepts Gzip, and check only requests after the first request.

Upvotes: 1

Andres Olarte
Andres Olarte

Reputation: 4380

Solution:

After a revision, this is what you need:

Client client = ClientProxy.getClient(port);
client.getInInterceptors().add(new GZIPInInterceptor());
client.getOutInterceptors().add(new GZIPOutInterceptor());

After that it worked.

Upvotes: 19

Related Questions