4. 内容协商
一套系统适配多端数据返回
- 移动端:返回JSON数据
- 第三方:返回XML
- IoT:返回自定义协议数据
1. 默认规则
1. SpringBoot 多端内容适配
- 基于
请求头
内容协商 【默认】- 客户端向服务端发送请求,携带HTTP标准的 Accept 请求头。
- Accept:application/json、text/xml、text/yaml
- 服务端根据客户端请求头期望的数据类型进行动态返回
- 客户端向服务端发送请求,携带HTTP标准的 Accept 请求头。
- 基于
请求参数
内容协商- 发送请求
GET /projects/spring-boot?format=json
- 匹配到
@GetMapping("/projects/spring-boot")
- 根据参数协商,优先返回 json 类型数据【需要开启参数匹配设置】
- 匹配到
- 发送请求
GET /projects/spring-boot?format=xml
,优先返回 xml 类型数据
- 发送请求
2. 内容协商原理 - HttpMessageConverter
HttpMessageConverter
怎么工作?何时工作?
定制HttpMessageConverter
来实现多端内容协商
编写WebMvcConfigurer
提供的configureMessageConverters
底层,修改底层的 MessageConverter
1. @ResponseBody 由 HttpMessageConverter 处理
标注了
@ResponseBody
的返回值 将会由支持它的HttpMessageConverter
写给浏览器
- 如果 controller 方法的返回值 标注了
@ResponseBody
注解- 请求进来会先来到
DispatchServlet
的doDispatch()
进行处理 - 找到一个
HandlerAdapter
适配器。利用适配器执行目标方法 RequestMappingHandlerAdapter
来执行,调用invokeHandlerMethod()
来执行目标方法- 目标方法执行之前,会准备好两个东西
- HandlerMethodArgumentResolver:参数解析器,确定目标方法每个参数值
- HandlerMethodReturnValueHandler:返回值处理器,确定目标方法的返回值该怎么处理
RequestMappingHandlerAdapter
里的invokeAndHandle()
真正执行目标方法- 目标方法执行完成,会返回 返回值对象
- 找到一个合适的返回值处理器
HandlerMethodReturnValueHandler
- 最终找到
RequestResponseBodyMethodProcessor
能处理 标注了@Response
注解的方法 RequestResponseBodyMethodProcessor
调用 writeWithMessageConverters,利用MessageConverter
把返回值写出去
- 请求进来会先来到
上面解释: @ResponseBody 由 HttpMessageConverter 处理
2. WebMvcAutoConfiguration 提供几种默认的 HttpMessageConverters
系统提供默认的 MessageConverter 功能有限,仅用于 json 或者 普通返回数据。额外增加新的内容协商功能,必须增加新的
HttpMessageConverter
3. 如何增加其他
具体代码实现
https://gitee.com/wei-zhou-abc/springboot3-study