SpringBoot内容协商机制
1、是什么?
SpringBoot内容协商机制是一种实现了内容协商(Content Negotiation)的Web服务器,它可以根据客户端请求的不同,将响应返回给客户端。
在传统的Web服务器中,如果客户端请求的URL与服务器上的URL不一致,服务器就会返回一个错误响应,告诉客户端所请求的URL不存在或者不合法。而SpringBoot内容协商机制则可以根据客户端请求的URL和服务器上的规则,动态地将响应返回给客户端,使得客户端可以成功地获取到所请求的数据。
SpringBoot内容协商机制的实现,可以使得服务器的负载减轻,提高服务器的可扩展性和可维护性,同时也可以提高客户端的响应速度和用户体验。
2、能干啥?
SpringBoot内容协商机制可以实现以下功能:
1、根据URL的不同,将响应返回给客户端;
2、动态地将响应返回给客户端,使得客户端可以成功地获取到所请求的数据;
3、提高服务器的负载能力,提高服务器的可扩展性和可维护性;
4、提高客户端的响应速度和用户体验。
5、根据响应头的“Accept”字段的不同,选择不同的处理方式;
6、......
总之,SpringBoot内容协商机制可以帮助Web服务器更好地处理不同来源的数据,提高服务的质量和可靠性。
3、怎么玩?
首先明确一下,SpringBoot默认是以JSON形式处理数据
(1) 基于请求头Accept的内容协商机制(SpringBoot默认开启)
例如:当我们请求头携带Accept:applicatiom/json时服务端会给我们返回json数据

当我们请求头携带Accept:applicatiom/xml时服务端会给我们返回xml数据

(2) 基于请求参数的内容协商机制(需要手动开启)
例如:发送请求 http://localhost:8080/json?format=json ,优先返回 json 类型数据
当然想要实现基于请求参数的内容协商,需要进行以下几个配置
1.导入依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
2.加入注解
@JacksonXmlRootElement // 支持写出xml文档
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private String email;
}
3.编写配置
spring:
mvc:
contentnegotiation:
favor-parameter: true # 开启基于请求参数的内容协商功能。 默认参数名:format。 默认此功能不开启
parameter-name: ly # 指定内容协商时使用的参数名。默认是 format
接下来就会有如下的效果了
json:

xml:

4、如何自定义内容返回?
例如:增加yaml返回支持,我想实现一个返回yaml格式的内容协商机制
(1) 导入依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
(2) 添加配置
spring:
mvc:
contentnegotiation:
favor-parameter: true # 开启基于请求参数的内容协商功能。 默认参数名:format。 默认此功能不开启
parameter-name: ly # 指定内容协商时使用的参数名。默认是 format
media-types:
yaml: application/yaml # 添加一种新的媒体配置
(3) 自定义一个HttpMessageConverter
package com.ly.component;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import com.ly.entity.User;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
/**
* @author ly (个人博客:https://www.cnblogs.com/ybbit)
* @date 2023-06-22 20:49
* @tags 喜欢就去努力的争取
*/
public class YamlHttpMessageConverter extends AbstractHttpMessageConverter {
private ObjectMapper objectMapper = null;
public YamlHttpMessageConverter() {
super(new MediaType("application", "yaml", StandardCharsets.UTF_8));
var factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
this.objectMapper = new ObjectMapper(factory);
}
@Override
protected boolean supports(Class clazz) {
// 只要是对象类型都支持
return true;
}
/**
* 读数据的规则
*
* @param clazz
* @param inputMessage
* @return
* @throws IOException
* @throws HttpMessageNotReadableException
*/
@Override
protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
User user = null;
try (InputStream is = inputMessage.getBody()) {
ObjectReader objectReader = this.objectMapper.readerFor(clazz);
user = objectReader.readValue(is, User.class);
System.out.println("user = " + user);
} catch (Exception e) {
throw new RuntimeException(e);
}
return user;
}
/**
* 写数据的规则
*
* @param methodReturnValue
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
*/
@Override
protected void writeInternal(Object methodReturnValue, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
try (OutputStream os = outputMessage.getBody()) {
this.objectMapper.writeValue(os, methodReturnValue);
}
}
}

SpringBoot内容协商机制的更多相关文章
- 深入理解SpringBoot核心机制《spring-boot-starter》
深入理解SpringBoot核心机制<spring-boot-starter> 前言: 对于这几年java火爆天的springBoot我相信大家都有所使用过,在springBoot的项目中 ...
- SpringBoot工作机制
1:前言 回顾探索Spring框架 1.spring ioc IoC其实有两种方式,一种就是DI,而另一种是DL,即Dependency Lookup(依赖查找),前者是当前软件实体被动接受其依赖的其 ...
- 深入springboot原理——一步步分析springboot启动机制(starter机制)
前言 使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程.本文的目的就是一步步分析springboot的启动过程 ...
- SpringBoot学习(二)探究Springboot启动机制
引言: SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起探究一下SpringBoot的启动原 ...
- SpringBoot原理—分析SpringBoot启动机制(starter机制)
一:前言使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程.本文的目的就是一步步分析springboot的启动过 ...
- SpringBoot Starter机制 - 自定义Starter
目录 前言 1.起源 2.SpringBoot Starter 原理 3.自定义 Starter 3.1 创建 Starter 3.2 测试自定义 Starter 前言 最近在学习Sp ...
- [译]谈谈SpringBoot 事件机制
要"监听"事件,我们总是可以将"监听器"作为事件源中的另一个方法写入事件,但这将使事件源与监听器的逻辑紧密耦合. 对于实际事件,我们比直接方法调用更灵活.我们可 ...
- Springboot 系列(七)Spring Boot web 开发之异常错误处理机制剖析
前言 相信大家在刚开始体验 Springboot 的时候一定会经常碰到这个页面,也就是访问一个不存在的页面的默认返回页面. 如果是其他客户端请求,如接口测试工具,会默认返回JSON数据. { &quo ...
- Spring MVC内置支持的4种内容协商方式【享学Spring MVC】
每篇一句 十个光头九个富,最后一个会砍树 前言 不知你在使用Spring Boot时是否对这样一个现象"诧异"过:同一个接口(同一个URL)在接口报错情况下,若你用rest访问,它 ...
- Spring MVC内容协商实现原理及自定义配置【享学Spring MVC】
每篇一句 在绝对力量面前,一切技巧都是浮云 前言 上文 介绍了Http内容协商的一些概念,以及Spring MVC内置的4种协商方式使用介绍.本文主要针对Spring MVC内容协商方式:从步骤.原理 ...
随机推荐
- 《Linux基础》05. 定时任务调度 · 磁盘分区与挂载 · 网络配置
@ 目录 1:定时任务调度 1.1:crontab 1.2:at 2:磁盘分区与挂载 2.1:原理介绍 2.2:硬盘说明 2.3:磁盘目录情况查询 2.3.1:lsblk 2.3.2:df 2.3.3 ...
- 算法笔记_python
目录 算法 概念 时间复杂度 空间复杂度 递归原理 顺序查找 二分查找 列表排序 LowB 三人组 冒泡排序 选择排序 插入排序 NB三人组 快速排序 堆排序 归并排序 NB三人组小结 总结 其他排序 ...
- Eclipse修改Web项目名称
Eclipse修改Web项目名称需要两步: 1:修改该项目目录下:.project文件 <projectDescription><name>SpringMVC-Annotati ...
- iOS MDM HeadFirst
引言 Apple MDM (Mobile Device Management) 字面理解就是一种管理移动设备的方式,覆盖 iOS 5 及更高版本的 iPhone/iPod touch/iPad.Mac ...
- vue2实现饼图Pie组件封装
实现如下效果: 效果展示:https://code.juejin.cn/pen/7226656439941955644 如果不会请移步到官网的栗子,请点击查看 直接给大家上代码: 整体代码片段 1 & ...
- 报错AttributeError: Attempted to set WANDB to False, but CfgNode is immutable
问题 今天在跑代码的时候,使用到了wandb记录训练数据. 我在23服务器上跑的好好的,但将环境迁移到80服务器上重新开始跑时,却遇到了如下报错 看这个报错信息是由于wandb没有apis这个属 ...
- Linux系列教程——Linux磁盘管理、Linux进程管理、Linux系统服务、 Linux计划任务
@ 目录 1 Linux磁盘管理 1.磁盘的基本概念 1.什么是磁盘 2.磁盘的基本结构 3.磁盘的预备知识 1.磁盘的接口类型 2.磁盘的基本术语 3.磁盘在系统上的命名方式 4.磁盘基本分区Fdi ...
- TOP GP 把已经编译的per反编回对应版本的4fd(画面档)
由于GP5.1,5.2,5.3的genero对应版本画面档开发互不兼容,下面提供各版本之间互转的操作方法: xshell切换到要反编译的per档目录,执行以下命令,就会在同目录下生成对应4fd档资料 ...
- ERP 财务管理的应付帐款流程
导读:应付帐款流程与应收帐款流程是财务管理的开端,也是财务工作的主要流程.若能够这两大流程控制好了,ERP系统的财务模块也就成功了一大半了.我先讲一下财务管理的应付帐款流程. 企业的应付帐款有很多种类 ...
- isHex
public class Test { public static boolean isHex(String str) { boolean isHexFlg = true; int i = 0; ch ...