john
john

Reputation: 613

Decompressing REST response with GZIPInputStream

I'm trying to decompress a gzip:ed response i receive from a REST service:

Content-Encoding=[gzip], Content-Type=[application/json], Content-Length=[710] ...

I'm using the Grails REST Client Builder Plugin:

def response = new RestBuilder().get(HOST + "/api/..."){
        contentType "application/json"
        accept "application/json"
}       

The returned response is a Spring ResponseEntity. I'm trying to decompress the data using GZIPInputStream:

String body = response.getBody()        
new GZIPInputStream(new ByteArrayInputStream(body.getBytes())).text

This fails to Caused by ZipException: Not in GZIP format

Obviously there is something I'm doing wrong, but I can't figure out what. All advice is appriciated.

Upvotes: 3

Views: 6271

Answers (2)

rodrobin
rodrobin

Reputation: 66

If you really need to keep using the Rest Client Builder you only need to modify your client code slightly:

def response = new RestBuilder().get(HOST + "/api/..."){
    contentType "application/json"
    accept byte[].class, "application/json" }

Note the extra parameter in the accept call - byte[].class - which signifies that RestTemplate should refrain from any parsing of the response.

To decompress you can now do:

new GZIPInputStream(new ByteArrayInputStream(response.body))

Yeah, I know, already answered with accept but some might still find it helpful in case switching Rest components is not an option.

Upvotes: 4

john
john

Reputation: 613

I never managed to get it to work with grails / groovy libraries, so i switched to spring and httpcomponents:

HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClientBuilder.create().build());
RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory);

ResponseEntity<String> response = restTemplate.exchange(
            "some/url/", HttpMethod.GET, new HttpEntity<Object>(requestHeaders),
            String.class);

Which decoded gzip automatically and thus there are no longer any need for manual decoding.

Upvotes: 3

Related Questions