使用GZIPInputStream解压缩REST响应

时间:2015-02-01 18:04:50

标签: grails groovy gzip

我尝试解压缩从REST服务收到的gzip:ed响应:

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

我正在使用Grails REST Client Builder插件:

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

返回的响应是Spring ResponseEntity。我尝试使用GZIPInputStream解压缩数据:

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

这不符合Caused by ZipException: Not in GZIP format

显然有些事我做错了,但我无法弄清楚是什么。所有建议都是适当的。

2 个答案:

答案 0 :(得分:4)

如果确实需要继续使用Rest Client Builder,您只需要稍微修改一下客户端代码:

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

注意accept调用中的额外参数 - byte [] .class - 表示RestTemplate应该避免任何解析响应。

要解压缩,您现在可以:

new GZIPInputStream(new ByteArrayInputStream(response.body))

是的,我知道,已经接受了接受,但有些人可能仍然觉得在切换时无法选择Rest组件。

答案 1 :(得分:3)

我从来没有设法使用grails / groovy库,所以我切换到spring和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);

自动解码gzip,因此不再需要手动解码。