Java 如何有选择地对POST和PUT请求进行GZIP编码

Java 如何有选择地对POST和PUT请求进行GZIP编码,java,jersey,jax-rs,jersey-client,Java,Jersey,Jax Rs,Jersey Client,我正在web应用程序的服务器和客户端上使用Jersey。在服务器上,如中所述,我有拦截器来处理进出的GZIP压缩。从服务器端,使用@Compress注释可以很容易地选择压缩哪些资源方法。但是,如果我还想有选择地将实体从客户端压缩到服务器,那么最好的方法是什么 我已经开始向请求添加一个Content Encoding:x-gzip头,但我的客户端拦截器没有看到该头(可能是因为它不是正式的客户端头) 在您指向Jersey文档的第10.6节之前,请注意,这适用于服务器端。虽然我可以在客户端上做类似的事

我正在web应用程序的服务器和客户端上使用Jersey。在服务器上,如中所述,我有拦截器来处理进出的GZIP压缩。从服务器端,使用@Compress注释可以很容易地选择压缩哪些资源方法。但是,如果我还想有选择地将实体从客户端压缩到服务器,那么最好的方法是什么

我已经开始向请求添加一个Content Encoding:x-gzip头,但我的客户端拦截器没有看到该头(可能是因为它不是正式的客户端头)

在您指向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();
    }
}

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

您的问题在引用的副本中得到了回答,但我从建议的副本中得到的信息是,不建议将压缩实体发送到服务器。但是,因为我同时控制服务器和客户机,所以我知道服务器将接受gzip编码的消息。为了获得最佳效率,我只想压缩大型实体。它们为您提供了解决方案的概要。
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))