В HTTP вы можете определить заголовок Accept
, чтобы указать, какой контент вы хотите получить:
curl --header "Accept: text/plain" localhost:8080/greetings/
curl --header "Accept: application/xml" localhost:8080/greetings/
Интересно, есть ли в Micronaut встроенное решение для этого.
Есть сообщение в блоге (https://mrhaki.blogspot.com/2018/08/micronaut-mastery-return-response-based.html), в котором описывается, как производить различный вывод в зависимости от заголовка Accept
. Но мне это не кажется правильным, так как большинство вещей в Micronaut обрабатываютсяаннотации.
Я пытался использовать @Consumes(MediaType.TEXT_PLAIN)
, но это относится только к POST-запросам (что совершенно очевидно, поскольку Micronaut не потребляет данные по запросу GET). @Produces(MediaType.TEXT_PLAIN)
аннотация, кажется, устанавливает заголовок content type
и настраивает выходную кодировку, но, похоже, не взаимодействует с маршрутизацией.
@Produces(MediaType.APPLICATION_XML)
@Get("/")
String getXml() {
return "<greeting>Hello World</greeting>";
}
@Produces(MediaType.TEXT_PLAIN)
@Get("/")
String getPlaintext() {
return "Hello World";
}
Хотя я надеялся, что это перенаправит HTTP-запрос с Accept: text/plain
на getPlaintext () и Accept: application/xml
для getXml (), это привело к 2 совпадениям входящего запроса:
DEBUG i.m.h.s.netty.RoutingInBoundHandler - Encoding emitted response object [More than 1 route matched the incoming request. The following routes matched /greetings/: GET - /greetings, GET - /greetings] using codec: io.micronaut.jackson.codec.JsonMediaTypeCodec@41ffaeb8
Итак, есть ли встроенное решение для маршрутизации HTTP-запросов в зависимости отих Accept
заголовок?