SpringBoot RestTemplate 设置挡板

项目结构

image.png

代码

BaffleConfig

/**
 * @Description 记录配置信息
 * @Author wjx
 * @Date 2024/2/1 14:47
 **/
public interface BaffleConfig {
  
  // 是否开启挡板的开关
  public static boolean SWITCH = true;
  
  // 文件根目录
  public static String ROOT_PATH = "D:\\TIS\\mock";
  
  // http 挡板存在位置的文件名
  public static String HTTP_FILE_NAME = "http";
  
}

BaffleInfos

import java.util.concurrent.ConcurrentHashMap;

/**
 * @Description 存储挡板信息
 * @Author wjx
 * @Date 2024/2/1 11:25
 **/
public interface BaffleInfos {

  // http请求挡板 信息(会将文件中挡板的信息存在该处,用于全局使用)  key fileName  value 挡板内容
  public static ConcurrentHashMap<String, MockClientHttpResponse> HTTP_MOCK = new ConcurrentHashMap<>();
}

InitializeBaffleInfoRunner

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Arrays;

/**
 * @Description 初始化挡板信息
 * @Author wjx
 * @Date 2024/2/1 11:38
 **/
@Slf4j
@Component
public class InitializeBaffleInfoRunner implements ApplicationRunner {
  
  @Autowired
  private BaffleRead[] baffleReads;
  
  @Override
  public void run(ApplicationArguments args) throws Exception {
    // 判断挡板开关是否开启
    if (BaffleConfig.SWITCH){
      log.warn("*****************************挡板功能开启*****************************");
      // 开启。
      Arrays.asList(baffleReads).parallelStream().forEach(e -> e.read());
    }
  }
}

BaffleRead

/**
 * @Description 读取挡板
 * @Author wjx
 * @Date 2024/2/1 14:59
 **/
public interface BaffleRead {
  
  void read();
}

MockClientHttpResponse

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

public class MockClientHttpResponse implements ClientHttpResponse {

        private final byte[] body;

        public MockClientHttpResponse(byte[] body) {
            this.body = body;
        }

        @Override
        public HttpStatus getStatusCode() throws IOException {
            return HttpStatus.OK;
        }

        @Override
        public int getRawStatusCode() throws IOException {
            return HttpStatus.OK.value();
        }

        @Override
        public String getStatusText() throws IOException {
            return HttpStatus.OK.getReasonPhrase();
        }

        @Override
        public void close() {
            // Do nothing here
        }

        @Override
        public InputStream getBody() throws IOException {
            return new ByteArrayInputStream(body);
        }

        @Override
        public HttpHeaders getHeaders() {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            return headers;
        }
    }

HttpBaffleRead

import com.tianqiauto.baffle.BaffleInfos;
import com.tianqiauto.baffle.BaffleConfig;
import com.tianqiauto.baffle.BaffleRead;
import com.tianqiauto.baffle.MockClientHttpResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;

/**
 * @Description http 挡板读取
 * @Author wjx
 * @Date 2024/2/1 14:59
 **/
@Slf4j
@Component
public class HttpBaffleRead implements BaffleRead {
  @Override
  public void read() {
    // 判断文件夹是否存在
    File file = new File(BaffleConfig.ROOT_PATH + File.separator + BaffleConfig.HTTP_FILE_NAME);
    if (file.exists()){
      // 遍历文件,异步读取,并存储
      File[] files = file.listFiles();
      Arrays.asList(files).parallelStream().forEach(e -> {
        String name = StringUtils.stripFilenameExtension(e.getName());
        byte[] bytes = new byte[0];
        try {
          bytes = Files.readAllBytes(e.toPath());
        } catch (IOException ex) {
          log.error("【挡板建设时发生错误】文件名:{}",name,ex);
        }
        MockClientHttpResponse mockClientHttpResponse = new MockClientHttpResponse(bytes);
        BaffleInfos.HTTP_MOCK.put(name,mockClientHttpResponse);
      });
    }
    
  }
}

MockHttpInterceptor

import com.tianqiauto.baffle.BaffleConfig;
import com.tianqiauto.baffle.BaffleInfos;
import com.tianqiauto.baffle.MockClientHttpResponse;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;
import java.io.IOException;

/**
 * @Description http 拦截
 * @Author wjx
 * @Date 2024/2/1 16:26
 **/
@Component
public class MockHttpInterceptor implements ClientHttpRequestInterceptor {
  @Override
  public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    // 判断挡板开关是否开启
    if (BaffleConfig.SWITCH){
      // 开启。读取存储空间是否有对应的挡板
      String requestPart = request.getURI().getSchemeSpecificPart();
      String fileName = RequestFilenameMapping.mapping.get(requestPart);
      // 如果有对应的挡板,将挡板内容填充
      MockClientHttpResponse mockClientHttpResponse = BaffleInfos.HTTP_MOCK.get(fileName);
      if (mockClientHttpResponse != null) return mockClientHttpResponse;
    }
    return execution.execute(request,body);
  }
}

RequestFilenameMapping

import java.util.HashMap;

/**
 * @Description 请求路径和文件名映射
 * @Author wjx
 * @Date 2024/2/1 16:56
 **/
public class RequestFilenameMapping {
  
  // key 请求路径    value 文件名
  public static HashMap<String,String> mapping;
  
  static {
    mapping = new HashMap<String,String>();
    mapping.put("//61.××××:80××/yarn","xdd1");
  }
}

文件存储位置

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElementUI Form:Select 选择器

ElementUI安装与使用指南 Select 选择器 点击下载learnelementuispringboot项目源码 效果图 el-select.vue&#xff08;Select选择器&#xff09;页面效果图 项目里el-select.vue代码 <script> export default {name: el_select,data() {return {options: [{value…

LeetCode刷题:使用栈解决150. 逆波兰表达式求值

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

泰迪智能科技大模型微调项目训练营已开营

泰迪智能科技大模型微调项目训练营开营 跟张良均老师学大数据人工智能 项目一&#xff1a;医疗诊疗对话意图识别 项目二&#xff1a;中医问答系统 项目三&#xff1a;某平台股票评论情感识别 学习流程&#xff1a; 项目一&#xff1a;医疗诊疗对话…

validator 对象校验,自定义校验实现

一、导入validator工具需要的jar包 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.valid…

SketchBook 2022下载安装教程,保姆级教程,操作简单,小白也能轻松搞定,附安装包和工具

前言 Autodesk SketchBook是一款新一代的自然画图软件&#xff0c;软件界面新颖动人&#xff0c;功能强大&#xff0c;仿手绘效果逼真&#xff0c;笔刷工具分为铅笔&#xff0c;毛笔&#xff0c;马克笔&#xff0c;制图笔&#xff0c;水彩笔&#xff0c;油画笔&#xff0c;喷枪…

原来你的Windows自带沙盒功能!

什么是Windows沙盒&#xff1f; Windows沙盒是一种虚拟化技术&#xff0c;允许用户在安全隔离的环境中运行不受信任的应用程序。它是Windows 10操作系统的一个特性&#xff0c;旨在提高系统的安全性&#xff0c;防止潜在的威胁对主系统造成影响。 启用Windows沙盒 确保系统满…

【TCP】流量控制和拥塞控制

前言 TCP&#xff08;传输控制协议&#xff09;是互联网协议&#xff08;IP&#xff09;网络传输层协议&#xff0c;负责控制数据包的顺序和流量控制&#xff0c;以防止网络拥塞和数据丢失。TCP流量控制和拥塞控制是确保网络有效通信的重要机制。具体分析如下&#xff1a; 流…

单细胞scRNA-seq测序基础知识笔记

单细胞scRNA-seq测序基础知识笔记 scRNA-seq技术scRNA-seq 分析流程数据预处理聚类标准化数据筛选有用的数据数据降维聚类 Clustering 注释细胞类型 scRNA数据分析结尾 该笔记来源于 B站up 江湾青年 scRNA-seq技术 首先是如何测序&#xff0c;上图瓶中有很多细胞&#xff0c;…

AD24-原理图与PCB交互设置及PCB常用快捷键汇总

一、原理图与PCB交互设置 1、在原理图页&#xff0c;工具-交叉选择模式 2、设置完成后。在原理图页选择器件&#xff0c;然后再PCB页也会相应被选中 3、一般将网络与Pin脚的勾去掉 4、整齐排列 5、TC&#xff1a;查找网络、器件、Pin脚 二、PCB常用快捷键汇总

高效远控管理 向日葵企业版统计报表与自动分组解析

高效远控管理&#xff01;向日葵企业版统计报表与自动分组解析企业之所以引入商用远程控制方案&#xff0c;一个很大的因素就是因为需要对高频率、多设备的远程控制需求以及IT设备本身进行高效管理&#xff0c;因此一款优质的商用远程控制方案势必需要在这些方面搭载足够完善的…

idea查看日志的辅助插件 --- Grep Console (高亮、取消高亮)

&#x1f680; 分享一款很有用的插件&#xff1a;Grep Console &#x1f680; 我们在查看日志的时候可能会有遗漏&#xff0c;使用这款插件可以让特定的关键词高亮&#xff0c;可以达到不遗漏的效果&#xff01; 如果你是一个开发者或者对日志文件分析感兴趣&#xff0c;不要…

MySQL原理(四)索引(3)索引失效与索引区分度

一、索引失效&#xff1a; 首先未使用索引列作为查询条件索引是肯定会生效的&#xff0c;还有其他的情况&#xff0c;索引列做为了查询条件也失效了&#xff1a; ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(NAME, age, pos); 1、select 语句、order by语句&#xf…

x2openEuler 升级实操(centos7.8 to openEuler 20.03)

通过 x2openEuler 工具&#xff0c;将 centos 7.8 迁移至 OpenEuler 上&#xff0c;实际感受迁移过程。x2openEuler https://docs.openeuler.org/zh/docs/20.03_LTS_SP1/docs/x2openEuler/x2openEuler.html 环境准备 下载 x2openEuler 安装包 wget https://repo.oepkgs.net/o…

Nicn的刷题日常之带空格直角三角形图案

1.题目描述 描述 KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的带空格直角三角形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示直角三角形直角边的长度&am…

Linux 指令

Linux 指令 1 登入/登出1.1 关机1.2 重启1.3 切用户 2 文件和目录管理2.1 目录操作2.2 文件操作2.3 文件内容操作2.4 归档及压缩 3 文本编辑器 vim3.1 命令模式3.2 输入模式3.3 末行模式 4 用户和组管理4.1 用户和组帐号概述4.1.1 用户帐号4.1.2 UID和GID 4.2 用户管理 5 组管理…

算法:箱子之形摆放

一、算法描述及解析 要求将一批箱子按从上到下以‘之’字形的顺序摆放在宽度为 n 的空地上&#xff0c;输出箱子的摆放位置&#xff0c; 例如&#xff1a;箱子ABCDEFG&#xff0c;空地宽为3。 如输入&#xff1a; ABCDEFG 3 输出&#xff1a; AFG BE CD 注&#xff1a;最后一行…

leetcode 28.找出字符串中第一个匹配项的下标(python版)

需求 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。 如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;haystack…

2023年OceanBase开发者大会:核心内容与学习收获(附大会核心PPT下载)

本次大会邀请了众多业界领袖、技术大咖和开发者&#xff0c;共同探讨数据库领域的技术发展趋势和未来机会&#xff0c;与开发者共同探讨单机分布式、云原生、HTAP 等数据库前沿趋势&#xff0c;分享全新的产品 roadmap&#xff0c;交流场景探索和最佳实践。 一、大会核心内容 …

v-if及v-for、computed计算属性的使用

v-if 概念及使用 v-if是Vue.js中的一个指令&#xff0c;用于根据表达式的真假值条件性地渲染一块内容。如果表达式的值返回真&#xff0c;则Vue会渲染这块内容&#xff1b;如果返回假&#xff0c;则不渲染。 基本用法: <p v-if"isVisible">看到我了吗&#…

【vim 学习系列文章 3.2 -- vim 删除 空格】

文章目录 vim 删除行尾空格 vim 删除行尾空格 在代码开发的过程中&#xff0c;经常会遇到行尾有空格的现象&#xff0c;如下&#xff1a; 我们可以在 .vimrc 中通过map 命令来映射删除行尾空格的快捷键&#xff0c;如下&#xff1a; map d<space> :%s/\s*$//g <cr…