当前位置: 首页 > 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连支持一下,创造不易您们的支持是我的动力🤞

相关文章:

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

&#x1f600;前言 本篇博文是关于客户端接收能力不同&#xff0c;SpringBoot 返回不同媒体类型的数据如何处理的说明&#xff0c;希望你能够喜欢&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#…...

容器化相关面试题

Docker相关面试题 (1)Docker的组件包含哪些? 客户端:dockerclient服务端:dockerserver## 能看到相关的信息 docker info## docker client向docker daemon发送请求,docker daemon完成相应的任务,并把结果返还给容器 Docker镜像: docker镜像是一个只读的模板,是启动一…...

BIO、NIO、AIO 有什么区别

在Java中&#xff0c;BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;和AIO&#xff08;Asynchronous I/O&#xff09;都是用于处理I/O&#xff08;输入/输出&#xff09;操作的不同方式。它们在处理I/O时具有不同的特点和适用场景。 B…...

如何构建一个对象池并使用

1.背景 在项目中&#xff0c;如果频繁的通过new 创建对象&#xff0c;之后让gc再去回收&#xff0c;这就很容易造成内存抖动&#xff0c;并且频繁的GC本身也会消耗内存&#xff0c;这样就很容易在一瞬间造成OOM 内存溢出&#xff0c;因为瞬间申请大量内存会造成内存占用突然升…...

【沁恒蓝牙mesh】CH58x USB功能开发记录(三)

本博文主要记录 &#xff0c;【沁恒蓝牙mesh】CH58x USB功能开发记录&#xff08;三&#xff09;&#xff0c;数据收发基于寄存器级别解释 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的小菜鸟。&#x1f60e;&#x1f4dd; 个人主页&#xf…...

2023国赛数学建模D题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…...

linux 学习————LNMP之分布式部署

目录 一、概述 二、LNMP环境部署 三、配置nginx 四、 配置php使nginx能够解析.php 五、配置mysql 六、配置discuz进行登录论坛访问测试 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP&#xff0c;是一种常用的服务器架构。它由以下组件组成&#xff1a; Linux&#xff1a;作…...

第八课 双重所有格和不定代词

系列文章目录 文章目录 系列文章目录前言一、of s 的所有格1、of 有生命的名词 ’s2、of 名词性物主代词3、小结 二、反身代词1、作宾语和介词宾语2、作表语3、作固定惯语 三、相互代词四、指示代词 Such 和 Same 的用法 前言 一、of s 的所有格 1、of 有生命的名词 ’s 2、…...

使用xrdp协议远程桌面控制树莓派,无需公网IP!

远程桌面控制树莓派&#xff0c;我们可以用xrdp协议来实现&#xff0c;它内部使用的是windows远程桌面的协议。我们只需要在树莓派上安装xrdp&#xff0c;就可以在同个局域网下远程桌面控制树莓派。 而如果需要在公网下远程桌面控制树莓派&#xff0c;可以通过cpolar内网穿透&…...

数据结构【图的类型定义和存储结构】

数据结构之图 图的定义和概念图的定义图的术语 图的类型定义图的存储结构数组&#xff08;邻接矩阵&#xff09;表示法无向图的邻接矩阵表示法有向图的邻接矩阵表示法网&#xff08;即有权图&#xff09;的邻接矩阵表示法 邻接矩阵的ADT定义邻接表&#xff08;链式&#xff09;…...

PHP Smarty如何进行调试和错误处理?

欢迎来到PHP Smarty的世界。如果你在这里寻求如何调试和错误处理的方法&#xff0c;那么我可以向你保证&#xff0c;我们会让这个过程尽可能的有趣和轻松。 首先&#xff0c;让我们先来谈谈调试。在Smarty中&#xff0c;你可以使用以下几种方法来进行调试&#xff1a; 使用Sm…...

手搓vue3组件_0,打包配置

打包后引入项目是发现报错: Cannot read properties of null (reading isCE) TypeError: Cannot read properties of null (reading isCE)这个是由于vue版本冲突问题, 这里我引入了自己打包的ui组件库,但是ui组件库中打包进入了自己的vue,那么在此时使用时,如果你引入的自己的组…...

WebAssembly

WebAssembly&#xff08;简称Wasm&#xff09;是一种面向Web的二进制指令格式&#xff0c;用于在现代Web浏览器中运行高性能的可移植代码。它是一种跨平台、低级别的虚拟机技术&#xff0c;允许开发者将不同编程语言的代码编译成Wasm格式&#xff0c;然后在Web浏览器中运行。 …...

TM4C123库函数学习(2)--- LED闪烁,滴答定时器精准延时

前言 &#xff08;1&#xff09;阅读本文之前&#xff0c;需要先看TM4C123库函数学习&#xff08;1&#xff09;— 点亮LEDTM4C123的ROM函数简介keil开发环境搭建篇。 &#xff08;2&#xff09;TM4C123是M4的内核&#xff0c;拥有一个24位向下计数的SysTick定时器。&#xff0…...

Linux: network: tcp: back-off技术

当一个包需要重传的时候&#xff0c;会使用 exponential back-off来计算下一次重传的时间。 这个back-off的使用还是相当的广泛&#xff1a;《Adaptive Backoff Synchronization Technique》https://dl.acm.org/doi/pdf/10.1145/74926.74970 The general idea of backoff has …...

36 | 银行贷款数据分析

本文将以银行贷款数据分析为主题,深入探讨如何运用数据科学的方法,揭示银行贷款领域的内在规律和趋势。通过对贷款数据的分析,我们能够洞察不同类型贷款的分布情况、贷款金额的变化趋势,以及借款人的特征和还款情况等关键信息。 通过运用Python编程语言及相关的数据分析工…...

计算机网络-物理层(二)- 传输方式

计算机网络-物理层&#xff08;二&#xff09;- 传输方式 串型传输与并行传输 串行传输:是指数据是一个比特一个比特依次发送的&#xff0c;因此在发送端和接收端之间&#xff0c;只需要一条数据传输线路即可 并行传输:是指一次发送n个比特而不是一个比特&#xff0c;因此发送…...

超强台风“杜苏芮”来袭!如何实现安全可靠的通信?

暴雨来袭 超强台风“杜苏芮”是2023年太平洋台风季第5个被命名的台风&#xff0c;在我国东南沿海地区造成了巨大的影响&#xff0c;在7月28日登录福建省晋江市时&#xff0c;“杜苏芮”中心附近最大风力15级&#xff0c;达到了超强台风的等级&#xff1b;福州市区、闽侯、莆田…...

内网隧道—HTTP\DNS\ICMP

本文仅限于安全研究和学习&#xff0c;用户承担因使用此工具而导致的所有法律和相关责任&#xff01; 作者不承担任何法律和相关责任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…...

QT mouseTracking

在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent&#xff0c;但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到&#xff0c;需要setMouseTracking(true)。 如果鼠标跟踪失效&#xff08;默认&#xff09;&#xff0c;…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...