Content-Type RESTEasy 3 区分大小写

Content-Type case sensitivity in RESTEasy 3

我正在开发一个 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 class 的 toString() 方法,该方法将类型和子类型小写 MediaTypeHeaderDelegate. This should be correct, or at least unimportant, as RFC-1341 states that Content-Type values are case-insensitive - RFC-1341

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

我正在提交申请,但与此同时有什么方法可以覆盖 RESTEasy 的默认行为并发送 Content-Type headers 而不小写值?

感谢阅读。

我可以使用 RESTeasy 3.0 重现此行为。6.Final 但我并不期望它。也许你可以检查他们的 JIRA 如果这已经被讨论过或打开一个问题。我曾经在服务器端遇到问题,因为 RESTeasy 的 2.x 版本正在检查 Content-Type header case-sensitive 的字符集属性。这也被改变了。

您可以通过一个非常丑陋的解决方法解决此问题:在 ClientRequestFilter.

中再次覆盖 header
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);