ContentNegotiation 内容协商

作用

当我们访问一个 Controller 时返回值一般都采用 RESTful 风格 也就是返回 json 格式,内容格式可以为同一个 Url 返回多种不同的结果,如 xml 等。

Spring-Boot 默认禁止后缀匹配模式

通过指定返回值类型获取指定类型的返回值
使用

根据例子来感受一下

新建一个Controller

@RestController
public class TestContentNegotiation {

   @GetMapping("/projects/spring-boot")
   public User testContentNegotiation() {
      return new User("张三","123456");
   }
}

Pojo User

@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class User {
	private String name;
	private String studentNumber;
}

启动spring boot

通过 get 访问,可见结果返回的是json类型

springboot 应答header spring boot content type_spring boot


springboot 应答header spring boot content type_xml_02

尝试获取 xml 返回值

Spring Boot 默认规定 通过 ?format=...方式获取不同的返回值

配置

首先需要开启 Spring Boot 对内容协商的支持

application.properties

# 开启内容协商
spring.mvc.contentnegotiation.favor-parameter=true

添加 jackson 对 xml 的支持

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

Tip因为Spring Boot 默认继承Jackson 所以不需要添加 jackson-core 的依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
</dependency>

获取xml返回值

springboot 应答header spring boot content type_springboot 应答header_03

当然了,format=json 依然可以获取 json 返回值

自定义内容协商key名称

format key 是 spring boot 默认提供的,可以根据自己的需求进行更改。

如下面的例子 spring.mvc.contentnegotiation.parameter-name=custom 将key更改为 custom

# 开启内容协商
spring.mvc.contentnegotiation.favor-parameter=true
# 自定义参数默认(format)
spring.mvc.contentnegotiation.parameter-name=custom

测试

Ok, 可以正常获取 xml 类型的返回值

springboot 应答header spring boot content type_spring boot_04

自定义返回类型

可以自行设置返回类型的别名 也就是 format=value 的value值

在 application.properties 中添加

spring.mvc.contentnegotiation.media-types.apple=text/xml

此时通过 format = apple 也可以返回 xml 类型的值

springboot 应答header spring boot content type_xml_05

当传递key值时,返回值的类型,受请求头 Accept 的影响

当Accept 添加 application/xml 时 返回 xml 数据类型

springboot 应答header spring boot content type_spring_06


当 Accept 添加 application/json 时 返回 json 数据类型

springboot 应答header spring boot content type_java_07


后缀名模式

Spring Boot 官方:不推荐使用后缀模式匹配,将在未来的版本中删除。

如果你理解这些警告,并且仍然希望你的应用程序使用后缀模式匹配,下面的配置是必需的:

spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true

测试

获取 json 返回值

springboot 应答header spring boot content type_xml_08

获取 xml 返回值

springboot 应答header spring boot content type_spring_09