我正在将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
注释。
答案 0 :(得分:1)
您可以使用ReaderInterceptor
为described 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());