返回内容协商,@ResponseBody 注解

85 阅读2分钟

 http://localhost:8080/monster

编辑

1 直接进入主题, @ResponseBody 注解 根据什么来返回不同的内容呢?

根据请求头的 Accept 字段 ,

如果 客户端请求头为 Accept: application/json 就返回 json

如果 客户端请求头为 Accept: application/xml 就返回 xml (注意:在 spring默认不支持返回 xml 格式,要添加jackson-xml 依赖)

编辑

编辑

转换为 xml 格式的依赖

编辑

2 IDEA Debug 看看整个过程

AbstractJackson2HttpMessageConverter 的 writeInternal 方法 用于将 返回内容转换为指定格式为并写入 HTTP 响应体的方法

编辑

编辑

编辑

3 为什么 浏览器通常是 返回 json 格式 呢 ?

首先看看浏览器请求默认携带的 accept 字段 信息

编辑

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8 表示 这些返回类型都是能接受的。

q=0.9 表示权重 0.9 可以理解为优先级 ,意思是这些格式: text/html,application/xhtml+xml,application/xml 如果服务端有能力返回这些类型,服务端就优先返回其中这些类型 。

image/avif,image/webp,/;q=0.8 权重 0.8 image/avif 图像文件格式,image/webpWebP 图像格式 ,* */表示 所有类型 这些权重 0.8,

**如果权重 0.9 的格式服务端返回不了,服务端就考虑 权重 0.8 的类型, *** */表示接受所有类型 ,而 spring 是支持返回 json 格式的。所以就返回了 json 类型。

补充 : 在我们没有引入 jackson-dataformat-xml 依赖的时候,服务端是不支持处理 xml 格式的,因此返回了 json 类型。

1. 如图 浏览器默认返回 json

编辑

2 . 如果 引入了 jackson-dataformat-xml 依赖 ,就返回 xml,根据权重返回的

编辑

服务端就返回权重比较高的application/xm 数据格式了

编辑

4 服务端开启内容协商的功能

相当于修改 请求头的 accept 字段信息

编辑

带上参数 format 指定 要返回的内容格式

编辑