13. 内容协商


13.1 基本介绍

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

  2. 比如:

    ● 客户端 Http 请求 Accept: application/xml 则返回 xml 数据
    ● 客户端 Http 请求 Accept: application/json 则返回 json 数据

  3. 比如下面的示意图

在这里插入图片描述

在这里插入图片描述

13.2 内容协商-应用实例

  • 需求说明:
    • 使用Postman发送Http请求
    • 根据请求头不同,返回对应的 json数据 或者 xml 数据
    • 如下图所示

在这里插入图片描述

在这里插入图片描述

  1. 在 pom.xml 增加处理 xml 的依赖
 <!--引入处理xml的依赖-->
 <dependency>
     <groupId>com.fasterxml.jackson.dataformat</groupId>
     <artifactId>jackson-dataformat-xml</artifactId>
 </dependency>
  1. 使用Postman发出不同的 Http Header ,可以看到返回对应的数据格式 (特别说明:测试前请重启一把项目)

  2. 切换 Postman 不同的 Accept 类型,来 Debug 源码,看看对应的 JsonGenerator 类型

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

----- Accept 切换成 application/xml 进行Degug -----

在这里插入图片描述

在这里插入图片描述

  1. 使用浏览器请求,为什么会返回 xml 数据,而不是 json

在这里插入图片描述


在这里插入图片描述

13.3 注意事项和使用细节

  1. Postman 可以通过修改 Accept 的值,来返回不同的数据格式

  2. 对于浏览器,我们无法修改其 Accept 的值,怎么办?

    => 解决方案:开启支持基于请求参数的内容协商功能

  • 修改 application.yml,开启基于请求参数的内容协商功能

在这里插入图片描述

spring:
  mvc:
#    static-path-pattern: /xjsres/**  #修改静态资源访问的路径/前缀
    hiddenmethod:
      filter:
        enabled: true #启用了 HiddenHttpMethodFilter 支持 rest风格请求
    view:    # 配置了视图解析器
      suffix: .html
      prefix: /       # 这里需要注意 前缀prefix 要考虑 static-path-pattern 的配置
    contentnegotiation:
      favor-parameter: true # 开启基于请求参数的内容协商功能
  web:
    resources:
      #修改/指定 静态资源的 存放路径/位置 # String[] staticLocations
      #注意:配置了 static-locations 原来的访问路径就被覆盖了,如果需要保留,要再指定一下
      static-locations: ["classpath:/xjsimg/", "classpath:/META-INF/resources/",
                         "classpath:/resources/", "classpath:/static/", "classpath:/public/"]


在这里插入图片描述

  • 完成测试

在这里插入图片描述


在这里插入图片描述

  • 注意,参数 format 是规定好的 , 在开启请求参数的内容协商功能后,SpringBoot 底层 ParameterContentNegotiationStrategy 会通过 format 来接收参数,然后返回对应的 媒体类型/数据格式,当然 format=xx 这个 xx 媒体类型/数据格式 是 SpringBoot 可以处理的才行,不能乱写

在这里插入图片描述

  • 也可以自定义配置 内容协商的请求参数名

在这里插入图片描述

spring:
  mvc:
#    static-path-pattern: /xjsres/**  #修改静态资源访问的路径/前缀
    hiddenmethod:
      filter:
        enabled: true #启用了 HiddenHttpMethodFilter 支持 rest风格请求
    view:    # 配置了视图解析器
      suffix: .html
      prefix: /       # 这里需要注意 前缀prefix 要考虑 static-path-pattern 的配置
    contentnegotiation:
      favor-parameter: true # 开启基于请求参数的内容协商功能
      parameter-name: xjsformat # 我们自定义一个 内容协商的参数名 [默认是format]
  web:
    resources:
      #修改/指定 静态资源的 存放路径/位置 # String[] staticLocations
      #注意:配置了 static-locations 原来的访问路径就被覆盖了,如果需要保留,要再指定一下
      static-locations: ["classpath:/xjsimg/", "classpath:/META-INF/resources/",
                         "classpath:/resources/", "classpath:/static/", "classpath:/public/"]

在这里插入图片描述


在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要学就学灰太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值