数据相应
- 响应页面:发送一个请求,跳转到目标页面,单体项目,发送请求直接跳转
- 响应数据:前后分离项目;比如做一个后台只接收请求,给前端响应图片、音频、视频、文档等
响应JSON
- 1.想要springmvc快速返回一个JSON数据,必须在pom文件中引入starter-web场景,web场景中引入了JSON场景,相关处理依赖
@ResponseBody
给前端自动返回JSON数据 - 2.返回值解析器
处理各种返回值- 1.返回值处理器判断是否支持这种类型返回值supportsReturnType
- 2.返回值处理器调用handleReturnValue进行处理
- SpringMvc所支持的返回值
1 ModelAndView
2 Model
3 View
4 ResponseEntity
5 ResponseBodyEmitter
6 StreamingResponseBody
7 HttpEntity
8 HttpHeaders
9 Callable
10 DeferredResult
11 ListenableFuture
12 CompletionStage
13 WebAsyncTask
14 有 @ModelAttribute
15 @ResponseBody 注解 ---> RequestResponseBodyMethodProcessor
内容协商
根据客户端接收能力不同,返回不同类型的数据;在不同的情况下返回不同的内容
Accept请求头就是告诉服务器,接收方能接受什么样的数据;并且这个数据是有优先级的。
- 1.引入xml文件
- 2.postman分别测试返回json和xml
只需要改变请求头的Accpet字段。Http协议中规定的,,告诉服务器本客户端可以接收的数据类型。("application/json"/"application/xml") - 3.开启浏览器内容协商功能
为了方便内容协商,可以开启基于请求参数的内容协商功能。
请求头是没有办法改的,并且其中的类型有权重;想要实现不同类型之间的转换,需要进行如下操作:
在.yml配置文件当中,配置“内容协商配置”,默认是false,手动设置为true;开启参数方式的内容写上
设置以后,比如需要返回.xml类型,那就将需要的类型名放到路径上
在访问路径上携带format参数,来制定返回值的类型是json还是xml,所以发送请求方式就如上所示 - 原理:就是将底层所有Converter统计出来,找到最佳匹配,用支持最佳匹配类型的Converter,然后调用其进行数据转换
1.判断当前响应头中是否已经有确定的媒体类型。MedliaType
2.获取客户端(PostMan、浏览器)支持接收的内容类型。(获取客户端Accpet请求字段)【application/json】
3.遍历所有当前系统的MessageConverter,寻找出支持返回对象的Converter
4.baconverter支持的媒体类型统计出来
5.如,客户端需要【application/xml】。服务端能力【10种】
6.通过双层for循环匹配服务器、客户端都支持的数据类型,而后返回对应类型数据
自定义
- 1.当浏览器发送请求,希望是返回xml类型
- 2.当ajax请求就返回json
- 3.如果是硅谷发送请求,就返回自定义协议数据
步骤:
1.添加自定义的MessageConverter进系统底层
2.系统底层就会统计出所有MessageConverter能操作哪些类型
3.客户端内容协商