当前位置: 首页 > news >正文

带你了解什么是内容协商---如何返回不同媒体类型的数据

😀前言
本篇博文是关于客户端接收能力不同,SpringBoot 返回不同媒体类型的数据如何处理的说明,希望你能够喜欢😊

🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

文章目录

  • 返回格式数据处理
    • 处理JSON
      • 应用实例
    • 内容协商
      • 基本介绍
      • 内容协商-应用实例
      • 注意事项和使用细节
        • 代码示例
        • 完成测试
        • 注意
    • 😄总结

返回格式数据处理

客户端接收能力不同,SpringBoot 需要返回不同媒体类型的数据,以便客户端处理。

处理JSON

需求说明: 演示返回JSON 格式数据

image-20230813150606425

应用实例

  1. SpringBoot 支持返回JSON 格式数据,在启用WEB 开发场景时,已经引入了相关依赖

image-20230813150635938

image-20230813150648649

image-20230813150712570

  1. 创建com/nlc/web/controller/ResponseController.java
@Controller
public class ResponseController {//返回Monster数据-要求以json格式返回@GetMapping("/get/monster")@ResponseBodypublic Monster getMonster() {//说明//开发中, monster对象是从DB获取-这里模拟一个monster对象Monster monster = new Monster();monster.setId(100);monster.setName("奔波霸");monster.setAge(200);monster.setIsMarried(false);monster.setBirth(new Date());Car car = new Car();car.setName("奔驰");car.setPrice(222.2);monster.setCar(car);return monster;}
}
  1. Postman 完成测试

image-20230813151120151

  1. Debug 一下monster 对象以Json 格式返回

image-20230813151157370

内容协商

基本介绍

  1. 根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据
  2. 比如: 客户端Http 请求Accept: application/xml 则返回xml 数据,客户端Http 请求Accept: application/json 则返回json 数据
  3. 比如下面的示意图

image-20230813151416052

image-20230813151445644

内容协商-应用实例

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

image-20230813151545659

image-20230813151625651

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

image-20230813151814043

image-20230813151837932

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

image-20230813151919714

image-20230813151936226

  1. 使用浏览器请求,为什么会返回xml 数据分析,而不是json?
    image-20230813152024787

注意事项和使用细节

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

2.对于浏览器,我们无法修改其Accept 的值,怎么办?
解决方案: 开启支持基于请求参数的内容协商功能

代码示例

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

spring:mvc:
#    static-path-pattern: /res/** #修改静态资源访问的路径/前缀hiddenmethod:filter:enabled: true #启用了HiddenHttpMethodFilter,开启页面表单的Rest功能contentnegotiation:favor-parameter: true #开启基于请求参数的内容协商功能web:resources:#修改/指定 静态资源的访问路径/位置static-locations: ["classpath:/img/","classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/"]  #String[] staticLocations

完成测试

image-20230813152417647

image-20230813152432008

注意

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

image-20230813152603784

image-20230813152619325

修改application.yml,指定一个内容协商的参数名

spring:mvc:hiddenmethod:filter:enabled: true #启用了HiddenHttpMethodFilter,开启页面表单的Rest功能contentnegotiation:favor-parameter: true #开启基于请求参数的内容协商功能parameter-name: myformat #指定一个内容协商的参数名web:resources:#修改/指定 静态资源的访问路径/位置static-locations: ["classpath:/img/","classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/"] #String[] staticLocations

😄总结

  1. 客户端接收能力不同,SpringBoot 需要返回不同媒体类型的数据。
  2. 加入依赖记得刷新maven,否则idea识别不到就会报错。
  3. 内容协商的参数名可以自己指定一个,需要配置。

文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

http://www.lryc.cn/news/122678.html

相关文章:

  • 容器化相关面试题
  • BIO、NIO、AIO 有什么区别
  • 如何构建一个对象池并使用
  • 【沁恒蓝牙mesh】CH58x USB功能开发记录(三)
  • 2023国赛数学建模D题思路分析
  • linux 学习————LNMP之分布式部署
  • 第八课 双重所有格和不定代词
  • 使用xrdp协议远程桌面控制树莓派,无需公网IP!
  • 数据结构【图的类型定义和存储结构】
  • PHP Smarty如何进行调试和错误处理?
  • 手搓vue3组件_0,打包配置
  • WebAssembly
  • TM4C123库函数学习(2)--- LED闪烁,滴答定时器精准延时
  • Linux: network: tcp: back-off技术
  • 36 | 银行贷款数据分析
  • 计算机网络-物理层(二)- 传输方式
  • 超强台风“杜苏芮”来袭!如何实现安全可靠的通信?
  • 内网隧道—HTTP\DNS\ICMP
  • QT mouseTracking
  • java操作mongdb【超详细】
  • JavaScript函数
  • RISC-V公测平台发布 · 使用YCSB测试SG2042上的MySQL性能
  • 母婴即时零售行业数据可视化分析
  • 快速解决IDEA中类的图标变成J,不是C的情况
  • vue学习笔记
  • 难解的bug
  • 人文景区有必要做VR云游吗?如何满足游客出行需求?
  • 【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析
  • 3.解构赋值
  • ChatGPT在智能游戏和游戏AI中的应用如何?