😀前言
本篇博文是关于客户端接收能力不同,SpringBoot 返回不同媒体类型的数据如何处理的说明,希望你能够喜欢😊
🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊
文章目录
- 返回格式数据处理
- 处理JSON
- 应用实例
- 内容协商
- 基本介绍
- 内容协商-应用实例
- 注意事项和使用细节
- 代码示例
- 完成测试
- 注意
- 😄总结
返回格式数据处理
客户端接收能力不同,SpringBoot 需要返回不同媒体类型的数据,以便客户端处理。
处理JSON
需求说明: 演示返回JSON 格式数据
应用实例
- SpringBoot 支持返回JSON 格式数据,在启用WEB 开发场景时,已经引入了相关依赖
- 创建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;}
}
- Postman 完成测试
- Debug 一下monster 对象以Json 格式返回
内容协商
基本介绍
- 根据客户端接收能力不同,SpringBoot 返回不同媒体类型的数据
- 比如: 客户端Http 请求Accept: application/xml 则返回xml 数据,客户端Http 请求Accept: application/json 则返回json 数据
- 比如下面的示意图
内容协商-应用实例
● 需求说明: 使用Postman 发送Http 请求,根据请求头不同,返回对应的json 数据或者xml数据, 如图
- 在pom.xml 增加处理xml 的依赖,记得刷新maven
<!-- 引入支持返回xml 数据格式-->
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
- 使用Postman 发出不同的Http Header , 可以看到返回对应的数据格式(说明: 测试前请重启一把项目)
- 切换Postman 不同的Accept 类型, 来Debug 源码, 看看对应的JsonGenerator 类型
- 使用浏览器请求,为什么会返回xml 数据分析,而不是json?
注意事项和使用细节
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
完成测试
注意
参数format 是规定好的, 在开启请求参数的内容协商功能后,SpringBoot 底层ParameterContentNegotiationStrategy 会通过format 来接收参数,然后返回对应的媒体类型/数据格式, 当然format=xx 这个xx 媒体类型/数据格式是SpringBoot 可以处理的才行,不能乱写.
修改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
😄总结
- 客户端接收能力不同,SpringBoot 需要返回不同媒体类型的数据。
- 加入依赖记得刷新maven,否则idea识别不到就会报错。
- 内容协商的参数名可以自己指定一个,需要配置。
文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞