根据客户端接收能力不同,返回不同媒体类型的数据。
引入依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
可用Postman软件分别测试返回json和xml:只需要改变请求头中Accept字段(application/json、application/xml)。
Http协议中规定的,Accept字段告诉服务器本客户端可以接收的数据类型。
内容协商原理:
1、判断当前响应头中是否已经有确定的媒体类型MediaType。
2、获取客户端(PostMan、浏览器)支持接收的内容类型。(获取客户端Accept请求头字段application/xml)
①contentNegotiationManager 内容协商管理器 默认使用基于请求头的策略
② HeaderContentNegotiationStrategy 确定客户端可以接收的内容类型
3、遍历循环所有当前系统的 MessageConverter,看谁支持操作这个对象(Person)
4、找到支持操作Person的converter,把converter支持的媒体类型统计出来。
5、客户端需要application/xml,服务端有10种MediaType。
6、进行内容协商的最佳匹配媒体类型
7、用 支持 将对象转为 最佳匹配媒体类型 的converter。调用它进行转化 。
基于请求头!!
基于参数的内容协商策略
获取客户端(PostMan、浏览器)支持接收的内容类型。(获取客户端Accept请求头字段application/xml)
- contentNegotiationManager 内容协商管理器 默认使用基于请求头的策略
- HeaderContentNegotiationStrategy 确定客户端可以接收的内容类型
yml中配置:开启内容协商功能
spring:
contentnegotiation:
favor-parameter: true #开启基于参数的内容协商功能
#localhost:8080/test/person?format=json (浏览器通过format定制发送内容的格式)
基于参数!!