Jersey 为什么球衣会吞下我的;内容编码“;标题

Jersey 为什么球衣会吞下我的;内容编码“;标题,jersey,jax-rs,jersey-client,Jersey,Jax Rs,Jersey Client,为什么下面的示例在请求中吞下我的HTTP头以进行“内容编码”。我正在编写一个需要解码自定义编码格式的应用程序。但是,我永远无法从请求中获得“Content Encoding”头。既不在实际资源中,也不在ReaderInterceptor中。在响应中,此编码头不会被吞没 在以下(可运行)示例中可以很容易地观察到此行为: 在Jersey试图修改我的内容编码的幕后是否发生了一些神奇的事情?(它不能,因为它是一个封闭源代码编码,事实上,我必须通过查询网络中另一台服务器上的另一个应用程序来解决。)我甚至无

为什么下面的示例在请求中吞下我的HTTP头以进行“内容编码”。我正在编写一个需要解码自定义编码格式的应用程序。但是,我永远无法从请求中获得“Content Encoding”头。既不在实际资源中,也不在ReaderInterceptor中。在响应中,此编码头不会被吞没

在以下(可运行)示例中可以很容易地观察到此行为:

在Jersey试图修改我的内容编码的幕后是否发生了一些神奇的事情?(它不能,因为它是一个封闭源代码编码,事实上,我必须通过查询网络中另一台服务器上的另一个应用程序来解决。)我甚至无法在请求转储中发现“内容编码”头,这就是我怀疑Jersey根本不发送头的原因


当然,我可以使用一些“X-Content-Encoding”标题,如示例中所示。但这个解决方案只是愚蠢的。我已经搜索了各种
CommonProperties
ServerProperties
ClientProperties
常量池,但没有找到配置选项。

您看到的问题是,您正在使用

.post(Entity.text(QUESTION));
打电话。
Entity.text(…)
方法生成的实体的内容数据
Variant
字段设置为:

media type = "text/plain";
content language = null;
content encoding = null;
这些内容编码和语言的
null
值依次删除以前设置的
content-encoding
content-language
标题。要解决此问题,您需要将内容编码指定为实体的一部分:

    Response response = target(PATH)
            .request()
            .post(Entity.entity(QUESTION, 
                  new Variant(MediaType.TEXT_PLAIN_TYPE, (String) null, "my-encoding")));

(我同意这种行为有点令人困惑,因为它并不明显。也许我们应该修复Jersey,使其不使用
null
变量字段值覆盖标题(如果设置了…)

不幸的是,在Jersey中更改覆盖行为似乎并不简单。用于
post
方法的JAX-RS javadoc清楚地说明:以前设置的任何与变量相关的HTTP头(即
内容类型
内容语言
内容编码
)都将使用实体变量信息覆盖。我同意您的建议。在我的应用程序中,我使用
实体
指定自定义
媒体类型
。我一直想知道为什么没有明确的方法来设置内容编码,但我想这就是原因。非常感谢。对于未来的读者:我通过
JerseyTest#configureClient(ClientConfig)
向我的单元测试添加了一个
writeinterceptor
。这样做,我避免了很多锅炉板。由于拦截器是在调用
RequestBuilder#post(Entitiy)
后调用的,因此我可以添加请求头,并在解析
Entitiy
时覆盖隐式设置的请求头。但是,在我的单元测试之外使用此方法不起作用:
    Response response = target(PATH)
            .request()
            .post(Entity.entity(QUESTION, 
                  new Variant(MediaType.TEXT_PLAIN_TYPE, (String) null, "my-encoding")));