阅读(2958) (0)

Micronaut 接收请求的 Content-Type

2023-02-23 11:23:45 更新

默认情况下,Micronaut 控制器操作使用 application/json。 @Consumes 注释或任何 HTTP 方法注释的 consumes 成员支持使用其他内容类型。

 Java Groovy  Kotlin 
import io.micronaut.context.annotation.Requires;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Consumes;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;

@Controller("/consumes")
public class ConsumesController {

    @Post // (1)
    public HttpResponse index() {
        return HttpResponse.ok();
    }

    @Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON}) // (2)
    @Post("/multiple")
    public HttpResponse multipleConsumes() {
        return HttpResponse.ok();
    }

    @Post(value = "/member", consumes = MediaType.TEXT_PLAIN) // (3)
    public HttpResponse consumesMember() {
        return HttpResponse.ok();
    }
}
import io.micronaut.context.annotation.Requires
import io.micronaut.http.HttpResponse
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Consumes
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Post

@Controller("/consumes")
class ConsumesController {

    @Post // (1)
    HttpResponse index() {
        HttpResponse.ok()
    }

    @Consumes([MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON]) // (2)
    @Post("/multiple")
    HttpResponse multipleConsumes() {
        HttpResponse.ok()
    }

    @Post(value = "/member", consumes = MediaType.TEXT_PLAIN) // (3)
    HttpResponse consumesMember() {
        HttpResponse.ok()
    }
}
import io.micronaut.context.annotation.Requires
import io.micronaut.http.HttpResponse
import io.micronaut.http.MediaType
import io.micronaut.http.annotation.Consumes
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Post

@Controller("/consumes")
class ConsumesController {

    @Post // (1)
    fun index(): HttpResponse<*> {
        return HttpResponse.ok<Any>()
    }

    @Consumes(MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON) // (2)
    @Post("/multiple")
    fun multipleConsumes(): HttpResponse<*> {
        return HttpResponse.ok<Any>()
    }

    @Post(value = "/member", consumes = [MediaType.TEXT_PLAIN]) // (3)
    fun consumesMember(): HttpResponse<*> {
        return HttpResponse.ok<Any>()
    }
}
  1. 默认情况下,控制器操作使用 Content-Type 类型为 application/json 的请求。

  2. @Consumes 注释为传入请求采用支持媒体类型的 String[]。

  3. 内容类型也可以使用方法注释的 consumes 成员指定。

自定义处理的内容类型

通常 JSON 解析仅在内容类型为 application/json 时发生。其他 MediaTypeCodec 类的行为类似,因为它们具有可以处理的预定义内容类型。要扩展给定编解码器处理的媒体类型列表,请提供将存储在 CodecConfiguration 中的配置:

 Properties Yaml  Toml  Groovy  Hocon  JSON 
micronaut.codec.json.additionalTypes[0]=text/javascript
micronaut.codec.json.additionalTypes[1]=...
micronaut:
  codec:
    json:
      additionalTypes:
        - text/javascript
        - ...
[micronaut]
  [micronaut.codec]
    [micronaut.codec.json]
      additionalTypes=[
        "text/javascript",
        "..."
      ]
micronaut {
  codec {
    json {
      additionalTypes = ["text/javascript", "..."]
    }
  }
}
{
  micronaut {
    codec {
      json {
        additionalTypes = ["text/javascript", "..."]
      }
    }
  }
}
{
  "micronaut": {
    "codec": {
      "json": {
        "additionalTypes": ["text/javascript", "..."]
      }
    }
  }
}

目前支持的配置前缀有json、json-stream、text、text-stream。