我有一个修正的MediaType +参数,我试图根据该参数路由HTTP请求。
@Path("/beer")
@GET
@Path("/all")
@Consumes("application/vnd.foo+json;type=boo/sth1")
@Produces("application/vnd.foo+json;type=koo/sth2")
Response getBeer();
@GET
@Path("{id}")
@Consumes("application/vnd.foo+json;type=woo/sth3")
@Produces("application/vnd.foo+json;type=hoo/sth4")
Response getBeer2();
我阅读了很多有关版本控制以及如何使用自定义MediaType的文章:
+json
是可识别的MediaType,名称为JSON
,因此,遵循此格式的任何接受标头都将被视为JSON
我发送了GET
请求时
http:/localhost:8000/beer/11
(应转到第二个GET
方法)
使用
--header 'Accept: application/vnd.foo+json;type="koo/sth2"'
(类型错误)
它以200给出了正确的响应(JSON格式),
并且Content-Type
是hoo/sth4
。理想情况下,它应该返回406 not Acceptable
,但是响应类型始终与所需的+json
格式匹配,因此返回成功。
无论如何,我是否可以使type
的值成为必填项?
搜索后,我有几个想法,但不确定是否可行:
1。创建默认的mediaType +实现MessageBodyWriter / Reader(基于JacksonJsonProvider)
但是以这种方式,我需要为每个特定的类型值实现MessageBodyWriter / Reader。 def不想这样做。
2。创建一个新注释,如果给定类型与此注释匹配,则将请求路由到该方法,例如
@Request("woo/sth3")
@Response("hoo/sth4")
Response getBeer2();
在这种情况下,我应该重写RequestDispatcher / ResponseDispatcher之类的东西吗?
尽管这两种解决方案看起来都很丑陋,如果您对此有个好主意,请分享。
我将问题更具体地编辑,因此类型可以是"***/sth1"
之后的任何形式,例如"boo.foo/sth1"
和"keepoo/sth2"
。