原文转载
https://lequ7.com/guan-yu-springbootspringcontentnegotiation-nei-rong-xie-shang-zhi-shi-yong-pian-yi.html

背景

随着业务零碎的成熟,如果你的我的项目正好是公司的中台策略之一,然而上游零碎的接管形式不对立,这一种状况在一些老的公司零碎架构总经常出现,如果上游零碎不不便兼容,那么就须要中台零碎对外提供各种不同格局返回报文

内容协商

简略说就是服务提供方依据客户端所反对的格局来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格局进行返回,而如果须要一个接口即反对 json,又反对其余格局,开发和保护多套代码显然是不合理的,而 Spring 又恰好提供了该性能,那便是ContentNegotiation

在 Spring 中,决定一个数据是以 json、xml 还是 html 的形式返回有三种形式,别离如下:

1:favorPathExtension 后缀模式,例如:xxx.json,xxx.xml
2:favorParameter format模式,例如:xxx?format=json,xxx?format=xml,
3:通过申请的 Accept 来决定返回的值

在这三种模式中,后面两种模式都是敞开,如果须要关上,能够通过以下形式来开启

  • 1:重写 WebMvcConfigurer(Spring5.X当前举荐的实现类) 的 configureContentNegotiation 来设置为 true 即可
  • 2:设置 spring.mvc.contentnegotiation.favor-path-extension=true 或者 pring.mvc.contentnegotiation.favor-parameter=true
tips:如果是应用 Spring2.X以上的版本,不要开启 @EnableWebMvc 注解,否则会导致你的配置有效,如果须要开启该注解,则只能应用办法一重写 WebMvcConfigurer 了

三种模式

1:favorPathExtension 后缀模式

server:port: 8081
spring:mvc:contentnegotiation:favor-path-extension: truemedia-types:json: application/json

favor-path-extension 示意是否开启后缀匹配,media-types 示意后缀以何种形式进行解析,在这里须要留神一下肯定是须要有对应的 HttpMessageConvert 能力解析,否则是会提醒 406 Could not find acceptable representation

在 Spring 中曾经默认含有json解析的 HttpMessageConvert,所以是能够间接解析的,如果须要反对解析 xml,能够引入 xml 包
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>

当开启了后缀模式当前,返回的文本类型会依据你的入参做不同的解决,.json 会返回 json 格局的数据,.xml 会返回 xml 格局的数据,当然也能够自定义一个 HttpMessageConverter 来自定义的返回文本格式

GET localhost:8081/controller/advice/decrypt.json{"name": "a","age": 1,"date": null
}GET localhost:8081/controller/advice/decrypt.xml<Advice><name>a</name><age>1</age><date/>
</Advice>

2:favorParameter

这种模式下是通过在 url 中通过一个参数来辨别如何解析的,spring中曾经默认这个关键字是 format

批改配置文件如下:

server:port: 8081
spring:mvc:contentnegotiation:favor-parameter: true
GET localhost:8081/controller/advice/decrypt?format=json{"name": "a","age": 1,"date": null
}GET localhost:8081/controller/advice/decrypt?format=xml<Advice><name>a</name><age>1</age><date/>
</Advice>

当然也能够本人批改 parameter 的关键字,只须要在配置文件中调整下即可

parameter-name: meida_type

此时再次申请的时候 parameter 就须要调整为 meida_type,否则就会以默认的形式去解析返回的文本信息

Accept解析

这种就是默认的一种解析形式,无需进行任何配置,Spring 就是默认以这种模式进行解析的
GET申请

XML申请

关于springboot:Spring-ContentNegotiation内容协商之使用篇一相关推荐

  1. Spring之定时任务基本使用篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/08/01/180801-Spring之定时任务基本使用篇/ Spring之定时任务基本使用篇 spring- ...

  2. SpringBoot + Spring Security 简单入门

    这篇文章主要介绍了SpringBoot + Spring Security 简单入门 Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考 ...

  3. 玩转 SpringBoot 2 快速整合 | RESTful Api 篇

    概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...

  4. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  5. spring之旅第四篇-注解配置详解

    spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...

  6. Spring思维导图,让Spring不再难懂(aop篇)

    2019独角兽企业重金招聘Python工程师标准>>> 什么是aop AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Or ...

  7. spring boot实战(第六篇)加载application资源文件源码分析

    前言 在上一篇中了解了spring配置资源的加载过程,本篇在此基础上学习spring boot如何默认加载application.xml等文件信息的. ConfigFileApplicationLis ...

  8. 【笔记】springboot+spring security登录流程实现

    在登录控制器中添加一个登录接口login,在其中验证验证码.用户名.密码信息.匹配成功之后,执行Spring Security的登录认证机制.登录成功之后,返回Token令牌凭证. SysLoginC ...

  9. eureka集群只注册一个_Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

    Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇 本文主要内容: 1:spring cloud整合Eureka总结 本文是由凯哥(凯哥Java:kagejava ...

  10. Spring思维导图,让Spring不再难懂(cache篇)

    转载自 Spring思维导图,让Spring不再难懂(cache篇) 关于缓存 缓存是实际工作中非常常用的一种提高性能的方法.而在java中,所谓缓存,就是将程序或系统经常要调用的对象存在内存中,再次 ...

最新文章

  1. 面试题:请用代码实现ip地址与int之间互换?
  2. JSON Web Token - 在Web应用间安全地传递信息
  3. MTCNN人脸及特征点检测---代码应用详解c++
  4. COLING 2020 | CharBERT:字符敏感的预训练语言模型
  5. 使用pm2启动node文件_PM2 是什么
  6. NP、OSPF 缺省路由
  7. php输出单行,file - php如何随机输出文件内一行?
  8. 线性回归 T检验P值计算
  9. 地铁视频监控系统中无线监控技术的应用
  10. 服务器运行时间设置,服务器的时间同步设置方法
  11. 针对面试官提出的WPF逻辑树和视觉树
  12. small team
  13. HOS Develop Notes-开启ssh服务
  14. Ubuntu虚拟机中网络中没有网卡
  15. 网络协议与网络编程(双电脑串口通讯)
  16. 奇点临近:人工智能让人类变成软件,并迅速统治宇宙
  17. Hihocoder-H国的身份证号码I
  18. 文思海辉 墨尔本_团结墨尔本
  19. 使用python解决数独问题
  20. Android Textview缩进之悬挂缩进

热门文章

  1. my97日期范围限制
  2. python计算梯形面积程序编程解题思路_编写程序计算梯形面积
  3. Pandas 之DataFrame二维表基础操作及演示
  4. DXP PCB板的形状的改变
  5. 【论文阅读】A Memory-Efficient Deterministic Finite Automaton-Based Bit-Split String Matching Scheme
  6. 计算机毕业设计情况进展记录表,南京理工大学泰州科技学院毕业设计(论文)进展情况记录表.doc...
  7. 【笔记】Robust High-Resolution Video Matting with Temporal Guidance
  8. 【板栗糖GIS】Win11如何取消打印机任务
  9. 共享硬盘没有权限访问计算机,win7系统访问磁盘共享没有权限的解决方法
  10. 使用canvas标签绘制圆形、三角形