内容协商:根据Micronaut中的Accept标头进行路由

时间:2019-11-09 21:13:27

标签: micronaut

在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";
    }

虽然我希望这会将带有Accept: text/plain的HTTP请求路由到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标头来路由HTTP请求?

1 个答案:

答案 0 :(得分:0)

路由当前未考虑accept标头,但是路由却考虑了@ConsumesContent-Type标头。您可以使用具有相同URL的路由来接受不同的数据类型,然后将选择与内容类型匹配的路由。

您可以在Github上创建一个问题以进行讨论。它可能已经在那里,所以请务必先搜索