返回内容协商,@ResponseBody 注解
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 指定 要返回的内容格式