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

springBoot--web--http缓存机制测试

springBoot--web--http缓存机制测试

  • 前言
  • 1、多端内容适配
    • 基于请求头内容协商(默认开启)
    • 基于请求参数内容协商(需要开启)
  • 2、默认返回json数据
  • 3、设置返回xml数据
    • 导入jackson-dataformat-xml包
    • 在类文件中添加注解 @JacksonXmlRootElement
  • 4、基于请求参数内容协商功能,默认参数是format
  • 5、内容协商的原理--httpMessageConverter
    • @ResponseBody 由HttpMessageConverter处理
  • 6、增加yaml内容协商
    • 导入yaml文件
    • 把测试对象写成yaml
    • 在配置中增加yaml类型
    • 在config下配置一个把对象转为yaml的类
    • 定义类
    • 效果

在这里插入图片描述

前言

一套系统适配多端数据返回

1、多端内容适配

基于请求头内容协商(默认开启)

客户想服务器发送请求,携带http标准的Accept请求头
Accept:application/json text/xml text/yaml
服务端根据客户端请求头期望的数据类型进行动态返回

基于请求参数内容协商(需要开启)

发送请求 Get/projects/spring-boot?format=json
匹配到@GetMapping(*/projects/spring-boot*)
根据参数协商,优先返回json类型数据(需要开启参数匹配设置)
发送请求Get/projects/spring-boot?format=xml 优先返回xml类型数据

2、默认返回json数据

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

 @GetMapping("/person")public Person person(){Person person = new Person();person.setId(1l);person.setUserName("张三");person.setEmail("2aaa@qq.com");person.setAge(18);return person;}

3、设置返回xml数据

导入jackson-dataformat-xml包

在这里插入图片描述

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.15.3</version></dependency>

在类文件中添加注解 @JacksonXmlRootElement

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4、基于请求参数内容协商功能,默认参数是format

在配置文件中配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、内容协商的原理–httpMessageConverter

@ResponseBody 由HttpMessageConverter处理

在这里插入图片描述
在这里插入图片描述

6、增加yaml内容协商

导入yaml文件

在这里插入图片描述

把测试对象写成yaml

public static void main(String[] args) throws JsonProcessingException {Person person = new Person();person.setId(1l);person.setUserName("张三");person.setEmail("2aaa@qq.com");person.setAge(18);YAMLFactory factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);ObjectMapper mapper = new ObjectMapper(factory);String s = mapper.writeValueAsString(person);System.out.println(s);}

在配置中增加yaml类型

#增加一种新的内容类型
spring.mvc.contentnegotiation.media-types.yaml=text/yaml

在config下配置一个把对象转为yaml的类

在这里插入图片描述

package com.atguigu.boot304demo.config;import com.atguigu.boot304demo.component.MyYamlHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;
import java.util.concurrent.TimeUnit;/*** @author jitwxs* @date 2023年10月20日 10:18*/
//@EnableWebMvc //禁用boot的默认设置
@Configuration //这是一个配置类,给容器中放一个WevMvcConfigurer组件,就能自定义底层
public class MyConfig {@Beanpublic WebMvcConfigurer webMvcConfigurer(){return new WebMvcConfigurer() {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classPath:/a/", "classpath:/b/").setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS));}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MyYamlHttpMessageConverter());}};}
}

定义类

在这里插入图片描述

package com.atguigu.boot304demo.component;import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import lombok.Data;
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 org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;/*** @author jitwxs* @date 2023年10月21日 12:50*/
public class MyYamlHttpMessageConverter extends AbstractHttpMessageConverter<Object> {private ObjectMapper objectMapper = null;public MyYamlHttpMessageConverter(){
//        支持哪种媒体类型super(new MediaType("text","yaml", Charset.forName("UTF-8")));YAMLFactory factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);this.objectMapper = new ObjectMapper(factory);}@Overrideprotected boolean supports(Class<?> clazz) {
//        只要对象类型,不要基本类型return true;}@Override  //@RequestBodyprotected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null;}@Override  //@ResponseBody   //把对象怎样写出来protected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
//        try-with写法,自动关流
//        try(OutputStream os = outputMessage.getBody()){
//            this.objectMapper.writeValue(os, o);
//        }OutputStream body = outputMessage.getBody();try {this.objectMapper.writeValue(body,o);}finally {body.close();}}
}

效果

在这里插入图片描述

相关文章:

springBoot--web--http缓存机制测试

springBoot--web--http缓存机制测试 前言1、多端内容适配基于请求头内容协商&#xff08;默认开启&#xff09;基于请求参数内容协商&#xff08;需要开启&#xff09; 2、默认返回json数据3、设置返回xml数据导入jackson-dataformat-xml包在类文件中添加注解 JacksonXmlRootEl…...

免费活动】11月4日敏捷武林上海站 | Scrum.org CEO 亲临现场

活动介绍 过去的几年里&#xff0c;外界的风云变幻为我们的生活增添了一些不一样的色彩。在VUCA世界的浪潮里&#xff0c;每一个人都成为自己生活里的冒险家。面对每一次的变化&#xff0c;勇于探索未知&#xff0c;迎接挑战&#xff0c;努力追逐更好的自己。 七月&#xff0…...

VSCode搭建ESP32 ESP-IDF开发环境-Windows

陈拓 2023/10/09-2023/10/14 1. 安装Windows系统下的ESP32 ESP-IDF开发环境 见《Windows系统安装ESP32 ESP-IDF开发环境》 Windows系统安装ESP32 ESP-IDF开发环境-CSDN博客Windows系统安装ESP32 ESP-IDF开发环境。https://blog.csdn.net/chentuo2000/article/details/1339225…...

Java可重入锁(GPT编写)

Java可重入锁是Java并发编程中常用的一种锁机制&#xff0c;它可以允许同一个线程多次获取同一个锁&#xff0c;从而避免死锁和其他并发问题。在本篇博客中&#xff0c;我们将对Java可重入锁的源码进行分析&#xff0c;以便更好地理解它的实现原理和使用方法。 Java可重入锁的…...

京东数据平台:2023年9月京东净水器行业品牌销售排行榜!

鲸参谋监测的京东平台9月份净水器市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年9月份&#xff0c;京东平台净水器的销量为64万&#xff0c;环比下滑约9%&#xff0c;同比下滑约16%&#xff1b;销售额为5.2亿&#xff0c;环比下滑约12%&#xff0c;…...

skiaSharp linux 生成验码字体显示不出来

一、拷贝windows下的字体如&#xff1a;C:\Windows\Fonts 设置字体的地方&#xff1a; var fontPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts", "TAHOMA.TTF");最终效果&#xff1a;...

WuThreat身份安全云-TVD每日漏洞情报-2023-10-12

漏洞名称:curl SOCKS5 堆溢出漏洞(CVE-2023-38545) 漏洞级别:高危 漏洞编号:CVE-2023-38545,CNVD-2023-75809 相关涉及:cURL libcurl >7.69.0&#xff0c;<8.3.0 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25382 漏洞名称:Apache H…...

sobel边缘检测算法

Sobel边缘检测算法是一种常用的图像处理技术&#xff0c;用于检测图像中的边缘和轮廓。该算法基于离散卷积操作&#xff0c;通过对图像进行滤波来寻找图像中灰度值的变化。Sobel算子是一种常用的卷积核&#xff0c;用于检测图像中的垂直边缘和水平边缘。以下是Sobel边缘检测算法…...

Kotlin中抽象类与接口

Kotlin 中的抽象类和接口是面向对象编程中的重要概念&#xff0c;它们提供了一种用于定义和组织代码的方式。在下面的代码示例中&#xff0c;我们将介绍 Kotlin 中的抽象类和接口&#xff0c;并给出相应的示例。 抽象类 抽象类是一种不能被实例化的类&#xff0c;它仅用作其他…...

解决osg绘制场景时因Z冲突导致重影或闪烁等不正常情况

目录 1. 问题的提出 2. Z冲突&#xff08;z-fighting&#xff09;简介 2.1. Z冲突&#xff08;z-fighting&#xff09;产生的原因 2.2. 如何消除Z冲突&#xff08;z-fighting&#xff09; 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格&#xff0c;鼠标在棋盘格上单击…...

adb 获取 Android 设备中已安装的 apk 文件

前言 今天发现手机上一个应用在应用商店已经搜索不到了&#xff0c;想把其推荐给朋友使用&#xff0c;发现不知道从哪里找原始的 apk 安装文件&#xff0c;记录一下。 如何提取 apk 两种方法 MT管理器导出 可以使用 MT管理器(Android 平台逆向神器)&#xff0c;它有个 安装…...

学习记录683@类别不平衡问题解决的基本策略之再缩放的数学解释

什么是类别不平衡问题 分类学习方法都有一个共同的基本假设&#xff0c;即不同类别的训练样例数目相当。如果不同类别的训练样例数目稍有差别&#xff0c;通常影响不大&#xff0c;但若差别很大&#xff0c;则会对学习过程造成困扰。例如有998个反例&#xff0c;但正例只有2个…...

2023App测试必掌握的核心测试:UI、功能测试

一、UI测试 UI即User Interface (用户界面)的简称。UI 设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由、充分体现软件的定位和特点。手机APP从启动界面开始, 到运行过程,直至退出,…...

华为荣耀手机,开启开发者选项,hbuilder调试依然找不到

我的手机是华为荣耀50&#xff0c;其他华为手机不知道是不是这个问题哦 解决办法&#xff1a;usb配置&#xff0c;选择音频来源 然后就可以了...

【C++】特殊类实现

一、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c; 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 将拷贝构造函数与赋值运算符重载只声明不定义…...

代码随想录打卡第四十四天|● 01 二维背包问题 ●一维背包问题-滚动数组 ● 416. 分割等和子集

什么是01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 01背包的模板 二维dp数组 dp数组的含义 dp[i][j]含义下标为【0-i】之间…...

燃气管网智能巡检系统

燃气管网维护工作繁杂&#xff0c;涉及人员、资源、巡检等&#xff0c;稍一疏忽就会使我们的工作陷入被动&#xff0c;可见启用燃气管网智能巡检系统是很有必要的。 燃气管网智能巡检系统综合管理智能平台&#xff0c;可对燃气管网数据的统一管理&#xff0c;实现对日常巡查、养…...

【微信小程序开发】运用WXS进行后台数据交互

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 一.wxs是什么 WXS是指"微信小程序云开发"&#xff08;WeChat Mini Program Cloud Development&#xff09;&#xff0c;是由微信…...

屏幕录像推荐:Apeaksoft Screen Recorder 中文 for mac

Apeaksoft Screen Recorder 是一款功能强大的屏幕录制软件&#xff0c;它允许用户在 Windows 和 Mac 系统上捕捉和录制屏幕活动。无论是记录游戏过程、创建教学视频、制作演示文稿还是捕捉在线流媒体内容&#xff0c;该软件都提供了丰富的功能和工具。 以下是 Apeaksoft Scree…...

ALPHA开发板网络方案说明

一. 简介 正点原子 ALPHA开发板&#xff0c;包括我们移植的 Uboot&#xff0c;都是参考了 NXP&#xff08;恩智浦&#xff09;官方的开发板的。 I.MX6UL/ULL 内部有个以太网 MAC 外设&#xff0c;也就是 ENET &#xff0c;需要外接一个 PHY 芯片来实现网络通信功能&#…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

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

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

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...