【问题标题】:Content-Type case sensitivity in RESTEasy 3RESTEasy 3 中的内容类型区分大小写
【发布时间】:2015-07-16 14:02:25
【问题描述】:

我正在开发一个 RestEasy 客户端以连接到已定义自己的自定义媒体类型的第 3 方 REST 服务。一个虚构的例子是

application/vnd.abc.thirdPartyThing-v1+json

注意thirdParty中的大写P。

我正在使用 RESTEasy 3.0.11 来实现我的客户端。在我对服务进行 POST 调用时,我的代码看起来像

Response response = target.request()
        .post(Entity.<ThirdPartyThing>entity(
                thing,
                "application/vnd.abc.thirdPartyThing-v1+json"));

但是 RESTEasy 发送到服务器

Content-Type: application/vnd.abc.thirdpartything-v1+json

这是由于 RESTEasy 的 MediaTypeHeaderDelegate 类的 toString() 方法,该方法将类型和子类型 MediaTypeHeaderDelegate 小写。这应该是正确的,或者至少不重要,因为 RFC-1341 声明 Content-Type 值不区分大小写 - RFC-1341

不幸的是,第 3 方服务以区分大小写的方式检查 Content-Type,因此返回 415 UNSUPPORTED MEDIA TYPE 错误。我已经使用 curl 进行了测试,它不会改变 content-type 值,并确认这是一个案例问题。 application/vnd.abc.thirdPartyThing-v1+json 有效,application/vnd.abc.thirdpartything-v1+json 无效。

我正在提出票证,但与此同时,有什么方法可以覆盖 RESTEasy 的默认行为并发送 Content-Type 标头而不将值小写?

感谢阅读。

【问题讨论】:

    标签: http-headers content-type resteasy


    【解决方案1】:

    我可以使用 RESTeasy 3.0.6.Final 重现此行为,但我并不期待它。如果这已经被讨论过或打开一个问题,也许你可以查看他们的JIRA。我曾经在服务器端遇到问题,因为 RESTeasy 的 2.x 版本正在检查 Content-Type 标头的字符集属性是否区分大小写。这也被改变了。

    你可以通过一个非常丑陋的解决方法来解决这个问题:再次覆盖 ClientRequestFilter 中的标题。

    public class ContentTypeFilter implements ClientRequestFilter {
    
        private Map<String, String> contentTypes;
    
        public ContentTypeFilter() {
            contentTypes = new HashMap<>();
            contentTypes.put("text/foo", "text/Foo");
        }
    
        @Override
        public void filter(ClientRequestContext requestContext) throws IOException {
            String contentType = requestContext.getHeaderString("Content-Type");
            if (contentTypes.containsKey(contentType)) {
                requestContext.getHeaders().putSingle("Content-Type", contentTypes.get(contentType));
            }
        }
    
    }
    

    别忘了注册这个过滤器:

    Client client = ClientBuilder.newClient().register(ContentTypeFilter.class);
    

    【讨论】:

    • 嗨。首先,很抱歉长时间等待回复。部分由于这个问题,部分由于意识到 Web 应用程序已经使用了旧版本的 Jersey Bundle,我的代码将从中调用,我转而使用 Jersey 作为客户端,并且没有出现这个问题。所以它是特定于 RESTEasy 的。我终于找到了一个演示问题的简单示例并添加了您的 ContentTypeFilter - 就像一个魅力!真的,真的,丑陋的魅力。谢谢,已接受回答!
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多