如何有选择地GZIP编码POST和PUT请求

时间:2015-12-30 22:31:54

标签: java jersey jax-rs jersey-client

我在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))

我还有一个日志记录过滤器,它显示了所有请求标头。我已经简化了上面的内容,但是我添加的所有其他标题都会被记录下来。

0 个答案:

没有答案