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

news2024/10/6 1:36:15

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 {
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/static/**")
                        .addResourceLocations("classPath:/a/", "classpath:/b/")
                        .setCacheControl(CacheControl.maxAge(1180, TimeUnit.SECONDS));
            }

            @Override
            public 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);
    }

    @Override
    protected boolean supports(Class<?> clazz) {
//        只要对象类型,不要基本类型
        return true;
    }

    @Override  //@RequestBody
    protected 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();
                }

    }
}

效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 1 两数之和 (暴力循环 HashMap* ) 含set、数组、map作哈希表的特性分析*

Leetcode 1 两数之和 &#xff08;暴力循环 哈希表&#xff09; 解法1 &#xff1a; 暴力循环解法2 : 哈希表HashMap法:red_circle:为什么想到用哈希表呢&#xff1f;:red_circle:为什么想到用map呢&#xff1f;:red_circle:归纳使用数组、set、map做哈希法&#xff1a; 题目链…

LeetCode 2316. 统计无向图中无法互相到达点对数::广度优先搜索(BFS)

【LetMeFly】2316.统计无向图中无法互相到达点对数&#xff1a;广度优先搜索&#xff08;BFS&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/ 给你一个整数 n &#xff0c;表示一张 无向图 中…

WP Ultimate CSV Importer远程代码执行分析-CVE-2023-4142

1.前言 WordPress的WP Ultimate CSV Importer插件易受远程代码执行的攻击 2.影响版本 <=7.9.8(所有用户) 其他版本(管理员 3.漏洞信息 此漏洞发生在ImportHelpers.php中的get_header_values函数。 trim_content数组为漏洞触发位置 $header_trim 的作用是用来存储 $m…

数字医疗解决方案:互联网医院平台的创新应用

互联网医院平台代表了医疗行业的一项巨大创新&#xff0c;它利用数字技术为患者提供了更加便捷和高效的医疗服务。本文将探讨如何创新应用互联网医院平台&#xff0c;使用Python编程语言构建一个简单的远程医疗应用示例。 构建远程医疗应用 在本文中&#xff0c;我们将使用P…

@Cleanup() 使用注意事项

前端时间用lombok 的Cleanup() 想实现线程池的自动关闭&#xff0c;因为使用不当&#xff0c;查bug查了好久&#xff0c;因此写篇博客纪念下&#xff0c;同时也希望读者可以跳过这个坑。 Cleanup修饰的对象&#xff0c;可以在对象资源使用结束后&#xff0c;自动关闭。 1、错…

Map接口遍历方法

public static void main(String[] args) {Map map new HashMap();map.put("邓超", "孙俪");//替换map.put("王宝强", "马蓉");//okmap.put(null, "刘亦菲");//plmap.put("鹿晗", null);//okmap.put("lu汉&…

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

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

css3实现图片瀑布流,根据屏幕大小列可变和不可变的的瀑布流

前提是每张图片宽度要设置成一样,准备15张图测试 <div class"img-main"><div><img src"/assets/images/sq/1.jpg" alt"" title"1"></div><div><img src"/assets/images/sq/2.jpg" alt&quo…

Linux启动流程描述

目录 Linux的引导过程 启动系统内核 启动init进程 什么是Linux Linux的内核最初是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的 Linux全称GUN/Linux&#xff0c;是一套开源的类Unix操作系统&#xff0c;是一个基…

【Linux】基本操作指令汇总(不完全)

文章目录 操作系统概念补充lspwdsuechocdtouchmkdirrmdir指令 && rm 指令(重要)man指令cpmvcatmorelessheadtailstat时间相关的指令calfindgrepwcsortuniqwhichziptar:打包/解包&#xff0c;不打开它&#xff0c;直接看内容bcunamectrl cctrl rctrl d\ls cpulsmemdf-hw…

base64是什么?怎么用的?

Base64是一种将二进制数据转换为ASCII字符的编码方式。 它可以用于在文本协议中传输二进制数据,例如在电子邮件中传输图片或在网页中嵌入图像等。Base64编码使用64个字符集(A-Z、a-z、0-9和"+“、”/")来表示二进制数据。 Base64编码的原理是将3个字节的二进制数…

澳洲谷揽GRANAR谷物分析仪维修GR-1800蛋白检测仪

澳洲GRANAR谷揽GR-1800谷物分析仪应用领域&#xff1a;大豆、油菜籽、亚麻籽 常用分析指标&#xff1a;蛋白质、芥酸、水分、灰分 、油脂等 分析时间&#xff1a;&#xff1c;3min 使用场景&#xff1a;谷物收购、生产加工、实验室 GR-1800i型号特点 1.检测时间由3分钟缩短…

keil中报警告comparison of constant 100 with boolean expression is always true

keil中变量Wave_Fre为变值 需要更改为 if( (0<Wave_Fre)&&(Wave_Fre<100)) 因为在C中运算符计算从左到右&#xff0c;((0<Wave_Fre) < 100 )

修改工单状态BAPI

业务需求&#xff1a;创建内部订单后&#xff0c;自动审批内部订单订单&#xff08;状态改为REL&#xff09; 函数&#xff1a;I_CHANGE_STATUS 单据状态表&#xff1a;JEST 单据状态描述表&#xff1a;TJ02T DATA lv_object TYPE char22 .lv_object OR && p_lv_au…

【LeetCode】63. 不同路径 II

1 问题 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角…

Jmeter(八):jmeter接口自动化测试操作流程、计数器、定时器详解

Jmeter&#xff1a;jmeter接口自动化测试操作流程 在企业使用jmeter开展实际的接口自动化测试工具&#xff0c;建议按如下操作流程&#xff0c; 可以使整个接口测试过程更规范&#xff0c;更有效。 接口自动化的流程&#xff1a; 1、获取到接口文档&#xff1a;swagger、wor…

广州华锐视点:VR3D技术在中学物理实验中的应用

随着科技的飞速发展&#xff0c;VR(虚拟现实)技术已经成为当今教育领域的一股重要力量。它为传统教学带来了前所未有的变革&#xff0c;特别是在初中物理实验教学中&#xff0c;VR技术的应用为学生们开启了全新的学习之旅。下面&#xff0c;让我们一起来探讨VR/3D虚拟仿真中学物…

uboot 启动流程详细分析参考

1 基本概念 1.1 uboot 是什么&#xff1f; 当我们厌倦了裸机程序&#xff0c;而想要采用操作系统的时候&#xff0c;uboot就是不得不引入的一段程序。所以&#xff0c;uboot就是一段引导程序&#xff0c;在加载系统内核之前&#xff0c;完成硬件初始化&#xff0c;内存映射&a…

2016-2023全国MEM国家A类线趋势图:浙大MEM要高多少?

2024年全国MEM联考已经到了关键的冲刺阶段&#xff0c;以目前全国非全日制mem项目的招生录取情况来看&#xff0c;大多数都是以国家A类线作为其录取的基本参考依据。而mem项目的国家线子啊过去的几年中也是有过比较大的波动&#xff0c;最明显的是2022年的国家线达到了历史最高…

【fiddler+loadrunner 两兄弟制霸脚本开发】

前言 一、fiddler工具 1、运行fiddler工具 2、运行需要抓包的网站 这里以loadrunner自带的网站为例 点击“Start web Server” 再点击如下 会看到如下的页面 &#xff08;备注&#xff1a;这里把127.0.0.1改成本机的ip地址&#xff0c;有时fiddler工具会监控不到127.0.0.1的请…