SpringBoot中的RestTemplate使用笔记

SpringBoot中的RestTemplate使用笔记

为了方便使用,这里我封装成一个工具类来静态调用RestTemplate

以下代码是基于SpringBoot2.4.2版本写的案例

需要配置的application.yml如下

server:port: 7024servlet:context-path: /demosession:timeout: 30m  #默认会话过期时间30分钟encoding:enabled: truecharset: UTF-8force: truetomcat:uri-encoding: UTF-8spring:servlet:multipart:max-file-size: 50MB  #单个文件的最大上限max-request-size: 200MB  #单个请求的文件总大小限制location: ${user.home}/.${spring.application.name}/tempDirapplication:name: demojackson:time-zone: GMT+8date-format: yyyy-MM-dd HH:mm:ss
logging:file:#最终的存储路径是:  系统用户目录/.应用名称/logs/端口号/spring.logpath: ${user.home}/.${spring.application.name}/logs/${server.port}logback:rollingpolicy:max-file-size: 1MBmax-history: 7pattern:console: "%date  %clr(%level) [${PID}]  [%thread] [%magenta(%X{traceId})] %cyan(%logger{10}) [%file : %line] %msg%n"file: "%date %level [${PID}]   [%thread] [%X{traceId}] %logger{10} [%file : %line] %msg%n"

RestTemplateUtil工具类

package cn.test.util;import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Slf4j
public class RestTemplateUtil {public RestTemplateUtil() {}private static RestTemplate template;static {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();//http 读超时5sfactory.setReadTimeout(5000);//http 连接超时5sfactory.setConnectTimeout(5000);template = new RestTemplate(factory);List<ClientHttpRequestInterceptor> interceptorList = new ArrayList<>();interceptorList.add(new RestTemplateLogging());template.setInterceptors(interceptorList);}/*** get请求-无参数** @param url          请求url,如http://localhost:7024/demo/lic/getCheckInfo* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @return T 返回对象 如String/ Map /Resp/Result* <p>* 例:* String s = RestTemplateUtil.doHttpGet(* "http://localhost:7024/demo/lic/getCheckInfo",* String.class);*/public static <T> T doSimpleHttpGet(String url, Class<T> responseType, Map<String, String> reqHeaderMap) {return doGetHttp(url, responseType, new HashMap<>(), reqHeaderMap);}/*** get请求-可替换参数url** @param replaceUrl   可替换参数url 如http://localhost:7024/demo/t2/{v1}/{v2}* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @param urlPathVars  要替换的参数项 ,类型可以是字符串或数字* @return T 返回对象 如String/ Map /Resp/Result* <p>* 例:* Map s1 = RestTemplateUtil.doGetHttpPathVar(* "http://localhost:7024/demo/t2/{v1}/{v2}",* Map.class,* "v1wer", "v2r23r");*/public static <T> T doGetHttpPathVar(String replaceUrl,Class<T> responseType,Object... urlPathVars) {return template.getForObject(replaceUrl, responseType, urlPathVars);}/*** get请求-url为QueryString形式** @param qsUrl          请求url,如 http://localhost:7024/demo/t3?a={a}&b={b}* @param responseType   返回类型 如String.class/ Map.class /Resp.class /Result.class* @param queryStringMap {a=e12, b=r23r}* @return T 返回对象 如String/ Map /Resp/Result*/public static <T> T doGetHttpQueryString(String qsUrl,Class<T> responseType,Map<String, String> queryStringMap,Map<String, String> reqHeaderMap) {if (queryStringMap == null) {queryStringMap = new HashMap<>();}return doGetHttp(qsUrl, responseType, queryStringMap, reqHeaderMap);}private static <T> T doGetHttp(String qsUrl,Class<T> responseType,Map<String, String> queryStringMap,Map<String, String> reqHeaderMap) {HttpHeaders httpHeaders = new HttpHeaders();if (reqHeaderMap != null && !reqHeaderMap.isEmpty()) {for (String s : reqHeaderMap.keySet()) {httpHeaders.add(s, reqHeaderMap.get(s));}}HttpEntity<String> httpEntity = new HttpEntity<>(null, httpHeaders);ResponseEntity<T> tResponseEntity = template.exchange(qsUrl,HttpMethod.GET,httpEntity,responseType,queryStringMap);return tResponseEntity.getBody();}/*** post-body-json 形式的请求** @param url          请求url,如 http://localhost:7024/demo/t5* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @param reqJson      json字符串 如: {"macAddress":"8C:EC:4B:55:0E:EC","version":"v2123rt"}* @param reqHeaderMap 可选的请求头* @return T 返回对象 如String/ Map /Resp/Result*/public static <T> T doPostHttpJsonBody(String url,Class<T> responseType,String reqJson,Map<String, String> reqHeaderMap) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.APPLICATION_JSON);if (reqHeaderMap != null && !reqHeaderMap.isEmpty()) {for (String s : reqHeaderMap.keySet()) {httpHeaders.add(s, reqHeaderMap.get(s));}}HttpEntity<String> httpEntity = new HttpEntity<>(reqJson, httpHeaders);return template.postForObject(url, httpEntity, responseType);}/*** post-formData 形式的请求** @param url          请求url,如 http://localhost:7024/demo/t4* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @param formDataMap  {a=e12, b=r23r,c=123,d=true}* @param reqHeaderMap 可选的请求头* @return T 返回对象 如String/ Map /Resp/Result*/public static <T> T doPostHttpFormData(String url,Class<T> responseType,Map<String, Object> formDataMap,Map<String, String> reqHeaderMap) {HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);//可选的请求头if (reqHeaderMap != null && !reqHeaderMap.isEmpty()) {for (String s : reqHeaderMap.keySet()) {httpHeaders.add(s, reqHeaderMap.get(s));}}//构建填充formDataMultiValueMap<String, Object> formDataParam = new LinkedMultiValueMap<>();if (formDataMap != null && !formDataMap.isEmpty()) {for (String key : formDataMap.keySet()) {formDataParam.add(key, formDataMap.get(key));}}HttpEntity<MultiValueMap<String, Object>> httpEntity =new HttpEntity<>(formDataParam, httpHeaders);return template.postForObject(url, httpEntity, responseType);}/*** post-上传MultipartFile文件** @param url          请求url,如 http://localhost:7024/demo/t6* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @param file         java File 对象* @param reqHeaderMap 可选的请求头* @return T 返回对象 如String/ Map /Resp/Result*/public static <T> T doPostHttpUploadFile(String url,Class<T> responseType,File file,Map<String, String> reqHeaderMap) {Map<String, Object> formDataMap = new HashMap<>();//支持传输 MultipartFileformDataMap.put("file", new FileSystemResource(file));return doPostHttpFormData(url, responseType, formDataMap, reqHeaderMap);}/*** post-body-binary 二进制流 上传* @param url 请求url,如 http://localhost:7024/demo/t62* @param responseType  返回类型 如String.class/ Map.class /Resp.class /Result.class* @param file java File 对象* @return T 返回对象 如String/ Map /Resp/Result* @throws IOException*/public static <T> T doPostHttpBinaryStream(String url,Class<T> responseType,File file) throws IOException {HttpHeaders httpHeaders = new HttpHeaders();//固定请求头httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);httpHeaders.add("Content-Disposition", file.getName());//file转byte[] 字节流String absolutePath = file.getAbsolutePath();Path path = Paths.get(absolutePath);byte[] bytes = Files.readAllBytes(path);HttpEntity<byte[]> httpEntity = new HttpEntity<>(bytes, httpHeaders);return template.postForObject(url, httpEntity, responseType);}/*** put请求,常用于 更新(修改)已存在的数据** @param url          请求url,如 http://localhost:7024/demo/t7* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @param reqJson      实际开发中put请求一般传json参数,json里要有唯一键如id* @return T 返回对象 如String/ Map /Resp/Result*/public static <T> T doSimplePutJson(String url,Class<T> responseType,String reqJson) {return doPutJsonHttp(url, responseType, reqJson, null);}public static <T> T doPutJsonHttp(String url,Class<T> responseType,String reqJson,Map<String, String> reqHeaderMap) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);if (reqHeaderMap != null && !reqHeaderMap.isEmpty()) {for (String s : reqHeaderMap.keySet()) {headers.add(s, reqHeaderMap.get(s));}}ResponseEntity<T> tResponseEntity = template.exchange(url,HttpMethod.PUT,new HttpEntity<>(reqJson, headers),responseType,new HashMap<>());return tResponseEntity.getBody();}/*** DELETE--单个删除请求** @param url           可替换参数url 如http://localhost:7024/demo/t8/{id}* @param oneUrlPathVar 对应id值*/public static void doDeleteHttpOnePathVar(String url, Object oneUrlPathVar) {template.delete(url, oneUrlPathVar);}/*** DELETE--动态条件删除请求** @param url            请求url,如 http://localhost:7024/demo/t9?a={a}&b={b}* @param queryStringMap {a=e12, b=r23r}*/public static void doDeleteWhereHttp(String url, Map<String, String> queryStringMap) {template.delete(url, queryStringMap);}/*** DELETE--批量删除请求** @param url          请求url,如 http://localhost:7024/demo/t10* @param responseType 返回类型 如String.class/ Map.class /Resp.class /Result.class* @param reqJson      传json参数,json里要有唯一键数组如 {"ids":[1,2,3],"remark":"r23r","ts":1351311410}* @param reqHeaderMap 可选的请求头* @return T 返回对象 如String/ Map /Resp/Result*/public static <T> T doDeleteBatchByJson(String url,Class<T> responseType,String reqJson,Map<String, String> reqHeaderMap) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);if (reqHeaderMap != null && !reqHeaderMap.isEmpty()) {for (String s : reqHeaderMap.keySet()) {headers.add(s, reqHeaderMap.get(s));}}ResponseEntity<T> exchange = template.exchange(url,HttpMethod.DELETE,new HttpEntity<>(reqJson, headers),responseType,new HashMap<>());return exchange.getBody();}}

restTemplate日志拦截器

package cn.test.util;import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpRequest;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;import java.io.IOException;
import java.nio.charset.StandardCharsets;@Slf4j
public class RestTemplateLogging implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(HttpRequest request,byte[] body,ClientHttpRequestExecution execution) throws IOException {log.info("req method:{},url:{}", request.getMethod(),request.getURI());log.info("req headers:{}", request.getHeaders());if (MediaType.APPLICATION_JSON.equals(request.getHeaders().getContentType())) {log.info("req body:{}", new String(body, StandardCharsets.UTF_8));}ClientHttpResponse response = execution.execute(request, body);log.info("resp statCode:{}", response.getStatusCode());log.info("resp headers:{}", response.getHeaders());return response;}
}

测试效果

定义一些API接口

package cn.test.web;import cn.hutool.core.io.IoUtil;
import cn.test.lic.bean.CheckInfo;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;@RestController
public class TestController {/*** 含请求头参数的url ,必须用@RequestHeader 接收请求头** @param upk* @return*/@GetMapping("/t1")public String t1(@RequestHeader("upk") String upk) {System.err.println(upk);return "ewr21r12r";}/*** url路径变量 形式的http请求,必须用@PathVariable接收** @param v1* @param v2* @return*/@GetMapping("/t2/{v1}/{v2}")public TestResp t2(@PathVariable("v1") String v1,@PathVariable("v2") String v2) {TestResp build = TestResp.builder().v1(v1).v2(v2).build();//{"v1":"re","v2":"r23r"}return build;}/*** queryString形式的get查询* http://localhost:7024/demo/t3?a=e12&b=r23r** @param a* @param b* @return*/@GetMapping("/t3")public TestResp t3(@RequestParam String a,@RequestParam String b) {TestResp build = TestResp.builder().v1(a).v2(b).build();return build;}/*** post-formData 形式的请求** @param a post-form参数* @param b post-form参数* @return*/@PostMapping("/t4")public TestResp t4(@RequestParam String a,@RequestParam String b,int c,boolean d) {TestResp build = TestResp.builder().v1(a).v2(b).c(c).d(d).build();return build;}/*** post-body-json 形式的请求** @param checkInfo post-body-json参数* @return*/@PostMapping("/t5")public CheckInfo t5(@RequestBody CheckInfo checkInfo) {return checkInfo;}/*** 文件上传------MultipartFile方式,本质还是formData 形式的请求** @param file* @param upk* @return* @throws IOException*/@PostMapping("/t6")public String t6(@RequestPart("file") MultipartFile file,@RequestHeader("upk") String upk) throws IOException {System.out.println("upk:" + upk);if (!file.isEmpty()) {System.out.println(file.getName());System.out.println(file.getOriginalFilename());File file1 = new File("D:\\test7025\\" + file.getOriginalFilename());file1.delete();file.transferTo(file1);}return "ok!";}/*** post-body-binary 二进制流 上传 ,需要请求方声明固定的ContentType=application/octet-stream** @param request* @param name* @return* @throws Exception*/@PostMapping("/t62")public TestResp t62(HttpServletRequest request,@RequestHeader("Content-Disposition") String name) throws Exception {System.out.println(name);ServletInputStream inputStream = request.getInputStream();File file1 = new File("D:\\test7025\\" + name);if (!file1.exists()) {file1.createNewFile();}FileOutputStream fos = new FileOutputStream(file1);IoUtil.copy(inputStream, fos);IoUtil.closeIfPosible(inputStream);IoUtil.closeIfPosible(fos);TestResp build = TestResp.builder().v1("f3rtf23t").v2("bsft23gf3g2").build();return build;}/*** put +传json 的请求, 常用于修改某个数据** @param req TestReq ,一般要规定json里的唯一键必填,如id* @return TestReq*/@PutMapping("/t7")public TestReq t7(@RequestBody @Validated TestReq req) {System.out.println(req);return req;}/*** Delete请求* restful形式 删除单条数据,一般传数字id** @param id*/@DeleteMapping("/t8/{id}")public void t8(@PathVariable("id") Long id) {System.err.println(id);}/*** Delete请求* 按多个条件删除数据,条件一般要必填** @param a* @param b*/@DeleteMapping("/t9")public void t9(@RequestParam String a,@RequestParam String b) {System.err.println(a);System.err.println(b);}/*** Delete请求* 批量删除数据,一般至少要提供ids数组** @param req json里ids数组必填* @return*/@DeleteMapping("/t10")public Test2Req t10(@RequestBody Test2Req req) {System.err.println(req);return req;}}
package cn.test.web;import lombok.Data;@Data
public class Test2Req {private Long[] ids;private String remark;
}
package cn.test.web;import lombok.Data;import javax.validation.constraints.NotNull;@Data
public class TestReq {@NotNullprivate Long id;private String name;private String remark;
}
package cn.test.web;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestResp {private String v1;private String v2;private int c;private boolean d;
}

测试使用RestTemplateUtil

package cn.test;import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import cn.test.lic.api.CheckInfoResp;
import cn.test.lic.api.ResultVO;
import cn.test.util.JacksonUtil;
import cn.test.util.RestTemplateUtil;
import cn.test.web.Test2Req;
import cn.test.web.TestReq;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@Slf4j
@SpringBootTest
public class LicClientDemoAppTests {@Testvoid test1() throws IOException {HashMap<String, String> reqHeaderMap = new HashMap<>();reqHeaderMap.put("upk","ryju56u");System.err.println("----=-=-=--------------===");String s = RestTemplateUtil.doSimpleHttpGet("http://localhost:7024/demo/t1",String.class,reqHeaderMap);System.out.println(s);System.err.println("----=-=-=--------------===");ResultVO resultVO = RestTemplateUtil.doSimpleHttpGet("http://localhost:7024/demo/lic/getCheckInfo",ResultVO.class,reqHeaderMap);CheckInfoResp content = Convert.convert(CheckInfoResp.class,resultVO.getContent());System.out.println(content);System.err.println("----=-=-=--------------===");Map s1 = RestTemplateUtil.doGetHttpPathVar("http://localhost:7024/demo/t2/{v1}/{v2}",Map.class,"v1wer", "v2r23r");System.out.println(s1);System.err.println("----=-=-=--------------===");HashMap<String, String> sspMap = new HashMap<>();sspMap.put("a","r23r");sspMap.put("b","wer23r");String m1 = RestTemplateUtil.doGetHttpQueryString("http://localhost:7024/demo/t3?a={a}&b={b}",String.class,sspMap,reqHeaderMap);System.out.println(m1);System.err.println("----=-=-=--------------===");HashMap<String, Object> reqMap = new HashMap<>();reqMap.put("version","v2123rt");reqMap.put("macAddress","8C:EC:4B:55:0E:EC");String json = JacksonUtil.obj2String(reqMap);String t = RestTemplateUtil.doPostHttpJsonBody("http://localhost:7024/demo/t5",String.class, json,null);System.out.println(t);System.err.println("----=-=-=--------------===");HashMap<String, Object> formDataReq = new HashMap<>();formDataReq.put("a","v2123rt");formDataReq.put("b","8C:EC:4B:55:0E:EC");formDataReq.put("c",123);formDataReq.put("d",true);String s2 = RestTemplateUtil.doPostHttpFormData("http://localhost:7024/demo/t4",String.class,formDataReq, null);System.out.println(s2);System.err.println("----=-=-=--------------===");//formData文件上传String s3 = RestTemplateUtil.doPostHttpUploadFile("http://localhost:7024/demo/t6",String.class,new File("E:\\lay2023\\vitevue2023-know-wiki-frontend.rar"),reqHeaderMap);System.out.println(s3);System.err.println("----=-=-=--------------===");//body-binary二进制流上传String s325 = RestTemplateUtil.doPostHttpBinaryStream("http://localhost:7024/demo/t62",String.class,new File("E:\\lay2023\\vitevue2023-know-wiki-frontend.rar"));System.err.println(s325);System.err.println("----=-=-=--------------===");TestReq req = new TestReq();req.setId(123L);req.setName("ert23t");req.setRemark("dhg3t4te");String s4 = RestTemplateUtil.doSimplePutJson("http://localhost:7024/demo/t7",String.class, JacksonUtil.obj2String(req));System.err.println(s4);System.err.println("----=-=-=--------------===");RestTemplateUtil.doDeleteHttpOnePathVar("http://localhost:7024/demo/t8/{id}",321);System.err.println("----=-=-=--------------===");RestTemplateUtil.doDeleteWhereHttp("http://localhost:7024/demo/t9?a={a}&b={b}",sspMap);System.err.println("----=-=-=--------------===");Test2Req req2 = new Test2Req();Long[] ids = {321L,341L};req2.setIds(ids);req2.setRemark("dhg3t4te");String s5 = RestTemplateUtil.doDeleteBatchByJson("http://localhost:7024/demo/t10",String.class,JacksonUtil.obj2String(req2),null);System.out.println(s5);}}

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

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

相关文章

redis分布式锁

Redis 作者继续论述&#xff0c;如果对方认为&#xff0c;发生网络延迟、进程 GC 是在步骤 3 之后&#xff0c;也就是客户端确认拿到了锁&#xff0c;去操作共享资源的途中发生了问题&#xff0c;导致锁失效&#xff0c;那这不止是 Redlock 的问题&#xff0c;任何其它锁服务例…

数据库面试题

Mysql篇 &#xff08;1&#xff09;请你解释下mysql主从同步中的&#xff0c;全同步&#xff0c;异步&#xff0c;以及半同步的三种模式概念? 此题是XX想面试题。 MySQL默认的复制即是异步的&#xff1a; 主库在执行完客户端提交的事务后会立即将结果返给客户端&#xff0c…

Flowable-任务-脚本任务

定义 脚本任务&#xff08;Script Task&#xff09;是一种自动执行的活动。当流程执行到达脚本任务时&#xff0c;会执行相应的 脚本&#xff0c;完毕后继续执行后继路线。脚本任务无须人为参与&#xff0c;可以通过定义脚本实现自定义的业务逻辑。 图形标记 脚本任务显示为…

数据结构基础:3.单链表的实现。

单链表的介绍和实现 一.基本概念1.基本结构2.结构体节点的定义&#xff1a; 二.功能接口的实现0.第一个节点&#xff1a;plist1打印链表2创建一个节点3.头插4.头删5.尾插6.尾删7.查找8.在pos之前插入x9.在pos之后插入x10.删除pos位置11.删除pos的后一个位置12.链表释放 三.整体…

UE4/5C++多线程插件制作(二十、源码)

目录 头文件 MultiThreadPlugins.uplugin MultiThreadPlugins.Build.cs MultiThreadPlugins.h MTPPlatform.h MTPManage.h RTPAgendy.h MTPThreadTaskManage.h

C语言每天一练----输出水仙花数

题目&#xff1a;请输出所有的"水仙花数" 题解&#xff1a;所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。 例如, 153是水仙花数, 因为153 1 * 1 * 1 5 * 5 * 5 3 * 3 * 3" #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h&g…

【自动化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1&#xff0e;command 模块3.2&#xff0e;shell 模块3.3&#xff0e;cron 模块3.4&#xff0e;user 模块3.5&#xff0e;group 模块3.6&#xff0e;copy 模块3.7&#xff0e;file 模块8&#xff…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU

早上百度搜“神经网络KPU”&#xff0c;查到与非网的一篇文章《一文读懂APU/BPU/CPU/DPU/EPU/FPU/GPU等处理器》&#xff0c;介绍各种处理器非常详细&#xff0c;关于“KPU”的内容如下&#xff1a; KPU Knowledge Processing Unit。 嘉楠耘智&#xff08;canaan&#xff09;号…

k8s证书更新,kubeadm安装的K8S证书过期后无法使用后证书更新方法

k8s证书更新 1. 查看证书过期时间 #通过文件查看证书过期时间 for item in find /etc/kubernetes/pki -maxdepth 2 -name "*.crt";do openssl x509 -in $item -text -noout| grep Not;echo $item;done #通过命令查看证书过期时间 kubeadm certs check-expirationk8…

找不到mfc140u.dll怎么解决

第一&#xff1a;mfc140u.dll有什么用途&#xff1f; mfc140u.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分。MFC是 C中的一个框架&#xff0c;用于构建Windows应用程序的用户界面和功能。mfc140u.dll包含了MFC库中…

杂谈项——关于我在bw上的见闻,以及个人对二次元游戏行业方面的前瞻

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家带来一点不一样的&#xff0c;首先先光速叠一下甲&#xff1a; 在此说明博主并不是一个什么都知道的大佬&#xff0c;只是一个普通的老二次元以及期望以后能…

HCIP重发布实验

目录 实验要求&#xff1a; 步骤一&#xff1a;拓扑设计IP地址规划 拓扑设计 R1 R2 R3 R4 发布路由 R1 R2 R3 R4 双向重发布 在R2和R4 上进行 R2 R4 检查R1 修改开销值选路 择优选择去4.0网段的路径 测试&#xff1a;​编辑 择优选择去32网段的路径 测试&…

【uniapp 获取缓存及清除缓存】

小程序及H5 获取缓存&#xff1a; 使用uniapp中的wx.getStorageInfoSync()方法可以获取当前小程序或H5应用的本地缓存信息&#xff0c;如下所示&#xff1a; let storageInfo uni.getStorageInfoSync() console.log(storageInfo)其中&#xff0c;storageInfo是一个对象&…

短视频矩阵源码/系统搭建/源码

一、短视频矩阵系统开发需要具备以下能力 短视频技术能力&#xff1a;开发人员应具备短视频相关技术能力&#xff0c;如视频编解码、视频流媒体传输等。 大数据存储和处理能力&#xff1a;短视频矩阵系统需要处理大量的视频数据&#xff0c;因此需要具备大数据存储和处理的能力…

JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器

JavaScript快速入门&#xff1a;ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器 在当今丰富的网络环境中&#xff0c;处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK&#xff0c;开发人员可以利用它创建 PDF 查看器和编辑器&…

初探webAssembly | 京东物流技术团队

1 WebAssembly是什么&#xff1f; 一种运行在现代网络浏览器中的新型代码&#xff0c;并且提供新的性能特性和效果 W3C WebAssembly Community Group开发的一项网络标准&#xff0c;对于浏览器而言&#xff0c;WebAssembly 提供了一条途径&#xff0c;让各种语言编写的代码以接…

【Visual Studio】VS调用tensorflow C++API的配置(无需编译)

windows利用vs2015调用tensorflow c api 1. 首先下载并安装visual studio Visual Studio 2015 安装教程&#xff08;附安装包&#xff09;&#xff0c;按照博客中顺序来就可以 如果在安装过程中提示安装包丢失或损坏&#xff0c;参考VS2015安装过程中安装包丢失或损坏解决办…

策略模式的实现与应用:掌握灵活算法切换的技巧

文章目录 常用的设计模式有以下几种&#xff1a;一.创建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;二.结构型模式&#xff08;Structural Patterns&#xff09;&#xff1a;三.行为型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a;四.并发…

Spring注解系列——@PropertySource

在Spring框架中PropertySource注解是非常常用的一个注解&#xff0c;其主要作用是将外部化配置解析成key-value键值对"存入"Spring容器的Environment环境中&#xff0c;以便在Spring应用中可以通过Value或者占位符${key}的形式来使用这些配置。 使用案列 // Propert…

基于Citespace、vosviewer、R语言的文献计量学可视化分析及SCI论文高效写作方法教程

详情点击链接&#xff1a;基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法 前言 文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量…