SpringBoot-Web开发-数据响应与内容协商

目录

一、数据响应原理

二、内容协商

2.1 开启浏览器参数方式内容协商功能

2.2 内容协商原理


一、数据响应原理

         如何响应数据?

        最基本的用法:在控制器方法上加@ResponseBody注解,方法返回值就是返回浏览器json数据

        Springboot是如果解析返回值并返回json数据的呢?

        使用了返回值处理器HandlerMethodReturnValueHandler

  • 1、返回值处理器判断是否支持这种类型返回值 supportsReturnType
  • 2、返回值处理器调用 handleReturnValue 进行处理,下面就是处理不同类型返回值用到的不同类型的处理器

  • 3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的方法返回值。
  • 4.接下来利用 MessageConverters 进行处理将数据写为json,

                4.1、内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)

                4.2、SpringMVC会挨个遍历所有容器底层HttpMessageConverter ,看谁能处理?

                4.3、服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,

                4.4、得到MappingJackson2HttpMessageConverter可以将对象写为json返回

        MessageConverter规范:

        HttpMessageConverter: 看是否支持将此 Class类型对象,转为MediaType类型的数据。

                例子:Person对象转为JSON。或者 JSON转为Person

        默认的MessageConverter

二、内容协商

        根据客户端接收能力不同,返回不同媒体类型数据

2.1 开启浏览器参数方式内容协商功能

<dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
</dependency>
spring:
    contentnegotiation:
      favor-parameter: true  #开启请求参数内容协商模式

 这样就可以在浏览器发送请求时指定可以接受的参数类型了,例如:

http://localhost:8080/test/person?format=json
http://localhost:8080/test/person?format=xml

2.2 内容协商原理

        contentNegotiationManager用于进行内容协商

  • 1、判断当前响应头中是否已经有确定的媒体类型MediaType
  • 2、获取客户端支持接收内容类型

         有两种策略:

                1.参数开启内容协商url后面加上客户端期望接收的类型

                2.请求头获取客户端Accept请求头字段

                默认使用基于请求头的策略

  • 3、遍历循环所有当前系统的 MessageConverter,看谁支持操作这个对象
  • 4、找到合适的converter,把converter支持的媒体类型统计出来(有优先级

        例如客户端需要【application/xml】。而服务端可提供【10种、json、xml】

  • 5、调用最佳匹配媒体类型converter进行转化 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值