我在Web应用程序的服务器和客户端上使用Jersey。在服务器上,我有https://jersey.java.net/documentation/latest/filters-and-interceptors.html中提到的拦截器来处理GZIP压缩输出和进入。从服务器端,可以很容易地选择使用@Compress注释压缩哪些资源方法。但是,如果我还想有选择地将实体从客户端压缩到服务器,那么最好的方法是什么?
我开始在请求中添加Content-Encoding:x-gzip标头,但我的客户端Interceptor没有看到该标头(可能是因为它不是官方客户端标头)。
在指出Jersey文档的第10.6节之前,请注意这适用于服务器端。虽然我可以在客户端上做类似的事情,但我不想通过URL限制它。我宁愿控制压缩标志尽可能接近请求(即标题?)。
这是我到目前为止所拥有的内容,但由于我的标题已删除,因此无效:
class GzipWriterClientInterceptor implements WriterInterceptor {
private static final Set<String> supportedEncodings = new GZipEncoder().getSupportedEncodings(); //support gzip and x-gzip
@Override
public void aroundWriteTo(WriterInterceptorContext context)
throws IOException, WebApplicationException {
if (supportedEncodings.contains(context.getHeaders().getFirst(HttpHeaderConstants.CONTENT_ENCODING_HEADER))) {
System.out.println("ZIPPING DATA");
final OutputStream outputStream = context.getOutputStream();
context.setOutputStream(new GZIPOutputStream(outputStream));
} else {
context.headers.remove(HttpHeaderConstants.CONTENT_ENCODING_HEADER) //remove it since we won't actually be compressing the data
}
context.proceed();
}
}
样品申请:
Response response = getBaseTarget().path(getBasePath()).path(graphic.uuid.toString())
.request(DEFAULT_MEDIA_TYPE)
.header(HttpHeaderConstants.CONTENT_ENCODING_HEADER, MediaTypeConstants.ENCODING_GZIP)
.put( Entity.entity(graphic, DEFAULT_MEDIA_TYPE))
我还有一个日志记录过滤器,它显示了所有请求标头。我已经简化了上面的内容,但是我添加的所有其他标题都会被记录下来。