У меня есть исправленный параметр 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"'
(неправильный тип)
Это дало мне правильный ответ (в формате JSON) с 200,
и 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 или что-то еще?
Оба решения выглядят некрасиво, пожалуйста, поделитесь, если у вас есть хорошая идея по этому поводу.
Udpate:
Я редактирую свой вопрос, чтобы он был более конкретным, поэтому тип может быть любым, следуя формату "***/sth1"
, например. "boo.foo/sth1"
и "keepoo/sth2"
.