关于springboot:Spring-ContentNegotiation内容协商之使用篇一

31次阅读

共计 2028 个字符,预计需要花费 6 分钟才能阅读完成。

背景

随着业务零碎的成熟,如果你的我的项目正好是公司的中台策略之一,然而上游零碎的接管形式不对立,这一种状况在一些老的公司零碎架构总经常出现,如果上游零碎不不便兼容,那么就须要中台零碎对外提供各种不同格局返回报文

内容协商

简略说就是服务提供方依据客户端所反对的格局来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格局进行返回,而如果须要一个接口即反对 json,又反对其余格局,开发和保护多套代码显然是不合理的,而 Spring 又恰好提供了该性能,那便是 ContentNegotiation

在 Spring 中,决定一个数据是以 json、xml 还是 html 的形式返回有三种形式,别离如下:

1:favorPathExtension 后缀模式,例如:xxx.json,xxx.xml
2:favorParameter format 模式,例如:xxx?format=json,xxx?format=xml,
3:通过申请的 Accept 来决定返回的值

在这三种模式中,后面两种模式都是敞开,如果须要关上,能够通过以下形式来开启
1:重写 WebMvcConfigurer(Spring5.X 当前举荐的实现类) 的 configureContentNegotiation 来设置为 true 即可
2:设置 spring.mvc.contentnegotiation.favor-path-extension=true 或者 pring.mvc.contentnegotiation.favor-parameter=true

tips: 如果是应用 Spring2.X 以上的版本,不要开启 @EnableWebMvc 注解,否则会导致你的配置有效,如果须要开启该注解,则只能应用办法一重写 WebMvcConfigurer 了

三种模式

1:favorPathExtension 后缀模式

server:
  port: 8081
spring:
  mvc:
    contentnegotiation:
      favor-path-extension: true
      media-types:
        json: application/json

favor-path-extension 示意是否开启后缀匹配,media-types 示意后缀以何种形式进行解析,在这里须要留神一下肯定是须要有对应的 HttpMessageConvert 能力解析,否则是会提醒 406 Could not find acceptable representation

在 Spring 中曾经默认含有 json 解析的 HttpMessageConvert,所以是能够间接解析的,如果须要反对解析 xml,能够引入 xml 包

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

当开启了后缀模式当前,返回的文本类型会依据你的入参做不同的解决,.json 会返回 json 格局的数据,.xml 会返回 xml 格局的数据,当然也能够自定义一个 HttpMessageConverter 来自定义的返回文本格式

GET localhost:8081/controller/advice/decrypt.json

{
    "name": "a",
    "age": 1,
    "date": null
}

GET localhost:8081/controller/advice/decrypt.xml

<Advice>
    <name>a</name>
    <age>1</age>
    <date/>
</Advice>

2:favorParameter

这种模式下是通过在 url 中通过一个参数来辨别如何解析的,spring 中曾经默认这个关键字是 format

批改配置文件如下:

server:
  port: 8081
spring:
  mvc:
    contentnegotiation:
      favor-parameter: true
GET localhost:8081/controller/advice/decrypt?format=json

{
    "name": "a",
    "age": 1,
    "date": null
}

GET localhost:8081/controller/advice/decrypt?format=xml

<Advice>
    <name>a</name>
    <age>1</age>
    <date/>
</Advice>

当然也能够本人批改 parameter 的关键字,只须要在配置文件中调整下即可

parameter-name: meida_type

此时再次申请的时候 parameter 就须要调整为 meida_type,否则就会以默认的形式去解析返回的文本信息

Accept 解析

这种就是默认的一种解析形式,无需进行任何配置,Spring 就是默认以这种模式进行解析的
GET 申请

XML 申请

总结

本文只是简略的介绍了如何应用,后续会介绍原理篇

正文完
 0