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类型
尝试获取 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返回值
当然了,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 类型的返回值
自定义返回类型
可以自行设置返回类型的别名 也就是 format=value 的value值
在 application.properties 中添加
spring.mvc.contentnegotiation.media-types.apple=text/xml
此时通过 format = apple 也可以返回 xml 类型的值
当传递key值时,返回值的类型,受请求头 Accept 的影响
当Accept 添加 application/xml 时 返回 xml 数据类型
当 Accept 添加 application/json 时 返回 json 数据类型
后缀名模式
Spring Boot 官方:不推荐使用后缀模式匹配,将在未来的版本中删除。
如果你理解这些警告,并且仍然希望你的应用程序使用后缀模式匹配,下面的配置是必需的:
spring.mvc.contentnegotiation.favor-path-extension=true
spring.mvc.pathmatch.use-suffix-pattern=true
测试
获取 json 返回值
获取 xml 返回值