根据客户端接收能力不同、返回不同媒体类型的数据
导包:
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
使用postman测试返回json或xml
只需要改变请求头中的Accept字段,Http协议中规定的,告诉服务器本客户端可以接收的数据类型
开启浏览器参数内容协商功能
浏览器写请求头自定义为json或xml
在application.yml文件中
spring:
mvc:
contentnegotiation:
favor-parameter: true(默认为false)
然后在请求中使用format=(json或者是xml或其他)既可
确定客户端接收什么样的内容类型
Parameter策略优先确定是返回json数据(获取请求头中的format值)
原理:
1、判断当前响应头中是否已经有确定的媒体类型,MediaType
2、获取客户端(postman、浏览器)支持的内容类型(获取客户端Accept请求头字段) [application/xml]
3、contentNegotiationManager内容协商管理器,默认使用基于请求头的策略,默认只有一个策略
调用HeaderContentNegotiationStrategy来确定客户端可以接收的内容类型
··遍历循环所有当前系统的MessageConverter,看谁支持操作这个对象
··找到支持操作的Converter,把converter支持的媒体类型统计出来
··客户端需要[application/xml],服务端能力[10种\json\xml]
····进行内容协商的最佳匹配
····用支持 将对象转为最佳匹配媒体类型的converter,调用它进行转换
后四个支持把对象转为json/xml
自定义MessageConverter
1、@ResponseBody响应数据出去,调用RequestResponseBodyMethodProcessor处理
2、Processor处理方法返回值。通过MessageConverter处理
3、所有的MessageConverter合起来可以支持各种媒体类型数据的操作(读写)
4、内容协商找到最终的messageConverter
步骤:
1、添加自定义的MessageConverter进系统底层
然后在WebMvcConfigurer中添加进去
2、系统底层就会统计出所有MessageConverter能操作哪些类型
3、客户端内容协商[xxx – > xxx]
Springmvc的什么功能,一个入口给容器中添加一个WebMvcConfigurer,在里面改任何springmvc的配置都可以生效。
以format自定义参数进行内容协商
默认只有2种
在WebMvcConfigurer自定义一个内容协商策略
可以给format改名字
有可能我们添加的自定义的功能会覆盖默认的很多功能,导致一些默认的功能失效