编辑
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 指定 要返回的内容格式
编辑