基本介绍
根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据。
例如: 客户端 Http 请求头 Accept: 为application/xml 则返回 xml 数据,客户端 Http 请求头为Accept: application/json 则返回 json 数据
应用实例
环境准备
我们先创建一个简单的springboot架子,引入关于xml的依赖,后面会用到
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
然后创建一个People类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class People {
private Integer id;
private String name;
private String gender;
}
然后创建一个Controller
@RestController
public class ContentController {
@RequestMapping("/test")
public People people() {
return new People(1, "千束", "女");
}
}
可以看见,上面的/test请求就会返回一个people,我们来请求一下
postman请求
我们使用postman请求该地址,返回的是json数据
网页请求
我们使用网页请求,返回的是xml的数据
原因
对于上面相同的请求返回结果不同,原因就是他们的Accept不同
可以发现,postman的Accept是*/,也就是支持所有的相应格式,而游览器是text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9,这个是有优先级的,q代表权重,可以发现xml在前面,所以我们的springboot就会优先返回xml的格式数据。
我们Debug下源码,在AbstractJackson2HttpMessageConverter类中的writeInternal方法中,可以通过Accept的不同,设置相应的Content-Type
我们通过postman请求,Accept是/*,对应的Content-Type就是application/json
我们通过游览器请求,Accept是text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9,对应的Content-Type就是application/xhtml+xml
开启基于请求参数的内容协商功能
我们知道了可以通过控制请求的Accept来改变返回的格式,但是在poatman中可以设置Accept,在网页中却不能设置,这该怎么办呢?
很简单,我们只需要在配置文件中开启基于请求参数的内容协商功能
这样开启后,我们只需要在请求时带上format参数即可,format就是我们想要的返回格式,下面我们使用网页来进行测试,我们知道默认是返回xml,我们使用format指定json,看是否有效
可以发现,已经可以实现指定返回格式了。我们还可以自定义参数的名称,也就是不通过format指定,而是自己指定一个名称,例如我想叫做type,我们通过配置文件进行设置即可
再次请求,format已经失效了
使用type进行指定,没有问题