Согласование содержимого: маршрут в соответствии с заголовком Accept в Micronaut - PullRequest
0 голосов
/ 10 ноября 2019

В 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 заголовок?

...