Gzip格式解压缩 - 泽西岛

时间:2014-08-28 06:49:58

标签: java rest jersey jax-rs

我正在将Json压缩为Gzip格式并发送如下:

connection.setDoOutput(true); // sets POST method implicitly
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Content-Encoding", "gzip"); 

final byte[] originalBytes = body.getBytes("UTF-8"); 
final ByteArrayOutputStream baos = new ByteArrayOutputStream(originalBytes.length);
final ByteArrayEntity postBody = new ByteArrayEntity(baos.toByteArray());                       
method.setEntity(postBody);

我想收到Post请求并将其解压缩为一个字符串。我应该使用@Consumes注释。

1 个答案:

答案 0 :(得分:1)

您可以使用ReaderInterceptordescribed in the docmentation等资源类处理gzip-encoding透明。 拦截器看起来像这样:

@Provider
public class GzipReaderInterceptor implements ReaderInterceptor {

    @Override
    public Object aroundReadFrom(ReaderInterceptorContext context)  throws IOException, WebApplicationException {
        if ("gzip".equals(context.getHeaders().get("Content-Encoding"))) {
            InputStream originalInputStream = context.getInputStream();
            context.setInputStream(new GZIPInputStream(originalInputStream));
        }
        return context.proceed();
    }

}

对于您的资源类,gzipping是透明的。它仍然可以使用application/json。 您也不需要处理字节数组,只需像通常那样使用POJO:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response post(Person person) { /* */ }

一个问题也可能是您的客户端代码。 我不确定你是否真的在试着帖子,所以这里有一个完整的例子,用URLConnection发布一个gzipped实体:

String entity = "{\"firstname\":\"John\",\"lastname\":\"Doe\"}";

ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzos = new GZIPOutputStream(baos);
gzos.write(entity.getBytes("UTF-8"));
gzos.close();

URLConnection connection = new URL("http://whatever").openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Content-Encoding", "gzip");
connection.connect();
baos.writeTo(connection.getOutputStream());