Recebendo GZIP por WebService

Galera,

Estou criando uma classe Cliente para receber dados de um WebService. Aparentemente a requisição está funcionando corretamente, estou recebendo o Status 200/Ok.

Segue o código abaixo:

Pesquisa pesquisa = new Pesquisa("100", "TV");

String url = "http://www.site.com.br/Search";
		  
URI uri = URI.create(url);
		  		  
ResteasyClient client = new ResteasyClientBuilder().build();
ResteasyWebTarget target = client.target(uri);
Response response = target.request().post(Entity.entity(toJson(pesquisa), "application/json"));

String resposta = response.readEntity(String.class);

O problema está ocorrendo na linha 9 do código… O servidor está enviando no formato GZIP e não consigo receber a resposta corretamente.

Já alterei o código acima utilizando outras bibliotecas como Jersey ou Apache, mas o problema persiste.


Exception in thread "main" javax.ws.rs.ProcessingException: java.io.EOFException
	at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:278)
	at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readEntity(ClientResponse.java:178)
	at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:217)
	at br.com.site.main.test.main(test.java:67)
Caused by: java.io.EOFException
	at java.util.zip.GZIPInputStream.readUByte(Unknown Source)
	at java.util.zip.GZIPInputStream.readUShort(Unknown Source)
	at java.util.zip.GZIPInputStream.readHeader(Unknown Source)
	at java.util.zip.GZIPInputStream.<init>(Unknown Source)
	at java.util.zip.GZIPInputStream.<init>(Unknown Source)
	at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor$FinishableGZIPInputStream.<init>(GZIPDecodingInterceptor.java:26)
	at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.aroundReadFrom(GZIPDecodingInterceptor.java:43)
	at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53)
	at org.jboss.resteasy.security.doseta.DigitalVerificationInterceptor.aroundReadFrom(DigitalVerificationInterceptor.java:32)
	at org.jboss.resteasy.core.interception.AbstractReaderInterceptorContext.proceed(AbstractReaderInterceptorContext.java:53)
	at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:244)
	... 3 more

Alguem sabe como receber dados no formato GZIP?

Quando trabalhei com arquivos em rest, sempre passava-os através de byte[]… acredito que o mapeador do Json não tenha conhecimento de como mapear seu objeto de retorno (GZip).

[]'s

Acho que tenho que encontrar de receber o GZIP e depois descompacta-lo para ter acesso aos dados. Só que não tenho a minima ideia de como fazer isso. Já pesquisei muito e nenhuma solução deu certo.

Não conheço sobre RestEasy, mas no Jersey, ele trabalha com filtros (de Requisição e Resposta).
Você tem que explicitamente registrar no web.xml o filtro GZip no servidor pra ele interpretar o formato:

<init-param> <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> <param-value>com.sun.jersey.api.container.filter.GZIPContentEncodingFilter</param-value> </init-param>

No final, no seu servidor, a transformação para o formato da entidade é transparente pra você.
No cliente, ocorre o mesmo… Como você está executando declarativo, teria que explicitamente registrar o filtro GZip e informar pro servidor que você deseja a resposta em Gzip (acrescentando o header Accept-Encoding:gzip).

[code]com.sun.jersey.api.client.config.ClientConfig cfg = new com.sun.jersey.api.client.config.DefaultClientConfig();
cfg.getClasses().add(org.codehaus.jackson.jaxrs.JacksonJsonProvider.class);

com.sun.jersey.api.client.Client client = com.sun.jersey.api.client.Client.create(cfg);
client.addFilter(new com.sun.jersey.api.client.filter.GZIPContentEncodingFilter(true));

com.sun.jersey.api.client.WebResource resource = client.resource(URL);

com.sun.jersey.api.client.WebResource.Builder builder = resource
.header(“Accept-Encoding”, “gzip”)
.accept(javax.ws.rs.core.MediaType.APPLICATION_JSON_TYPE);

Dado dado = builder.get(Dado.class);[/code]

Este exemplo está em Jersey 1.17.
Ainda não consegui passar pro servidor o dado no formato GZip, mas somente receber a resposta em GZip.