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);
我正在开发一个 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.
中再次覆盖 headerpublic 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);