springboot数据响应请求之内容协商

根据客户端接收能力不同、返回不同媒体类型的数据
导包:

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

使用postman测试返回json或xml
springboot数据响应请求之内容协商_第1张图片
只需要改变请求头中的Accept字段,Http协议中规定的,告诉服务器本客户端可以接收的数据类型

开启浏览器参数内容协商功能

浏览器写请求头自定义为json或xml
在application.yml文件中

spring: 
	mvc: 
		contentnegotiation: 
			favor-parameter: true(默认为false)

然后在请求中使用format=(json或者是xml或其他)既可
在这里插入图片描述
springboot数据响应请求之内容协商_第2张图片
确定客户端接收什么样的内容类型
Parameter策略优先确定是返回json数据(获取请求头中的format值)
在这里插入图片描述
原理:

1、判断当前响应头中是否已经有确定的媒体类型,MediaType
2、获取客户端(postman、浏览器)支持的内容类型(获取客户端Accept请求头字段) [application/xml]
3、contentNegotiationManager内容协商管理器,默认使用基于请求头的策略,默认只有一个策略
在这里插入图片描述
调用HeaderContentNegotiationStrategy来确定客户端可以接收的内容类型
在这里插入图片描述
··遍历循环所有当前系统的MessageConverter,看谁支持操作这个对象
··找到支持操作的Converter,把converter支持的媒体类型统计出来
··客户端需要[application/xml],服务端能力[10种\json\xml]

springboot数据响应请求之内容协商_第3张图片
····进行内容协商的最佳匹配
····用支持 将对象转为最佳匹配媒体类型的converter,调用它进行转换

springboot数据响应请求之内容协商_第4张图片
后四个支持把对象转为json/xml

自定义MessageConverter

1、@ResponseBody响应数据出去,调用RequestResponseBodyMethodProcessor处理
2、Processor处理方法返回值。通过MessageConverter处理
3、所有的MessageConverter合起来可以支持各种媒体类型数据的操作(读写)
4、内容协商找到最终的messageConverter
步骤:
1、添加自定义的MessageConverter进系统底层
springboot数据响应请求之内容协商_第5张图片
springboot数据响应请求之内容协商_第6张图片
springboot数据响应请求之内容协商_第7张图片
在这里插入图片描述
然后在WebMvcConfigurer中添加进去
springboot数据响应请求之内容协商_第8张图片
2、系统底层就会统计出所有MessageConverter能操作哪些类型
3、客户端内容协商[xxx – > xxx]

Springmvc的什么功能,一个入口给容器中添加一个WebMvcConfigurer,在里面改任何springmvc的配置都可以生效。

以format自定义参数进行内容协商
默认只有2种
springboot数据响应请求之内容协商_第9张图片
在WebMvcConfigurer自定义一个内容协商策略
springboot数据响应请求之内容协商_第10张图片

可以给format改名字
在这里插入图片描述

在这里插入图片描述
有可能我们添加的自定义的功能会覆盖默认的很多功能,导致一些默认的功能失效

你可能感兴趣的:(springboot,java)