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

RestTemplate 常用方法(提供了多种方法来发送 HTTP 请求)

        RestTemplate 是 Spring 框架中用于同步客户端 HTTP 请求的一个类,它提供了多种方法来发送 HTTP 请求。以下是一些常用的 RestTemplate 方法及其代码案例:

1.postForObject()

该方法用于发送 POST 请求,并期望返回一个对象。以下是一个使用 postForObject 的示例:

RestTemplate restTemplate = new RestTemplate();
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
Assertions.assertNotNull(foo);
Assertions.assertEquals(foo.getName(), "bar");
  1. RestTemplate restTemplate = new RestTemplate();:创建了 RestTemplate 的一个实例,用于执行 HTTP 请求。

  2. HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));:创建了一个 HttpEntity 对象,它包含了要发送的数据(在这个例子中是一个 Foo 对象,其构造函数接收一个字符串参数 "bar")和 HTTP 头部信息(在这个例子中头部信息是空的,因为 HttpEntity 的构造函数没有接收任何头部信息参数)。

  3. Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);:使用 postForObject 方法发送 POST 请求到 fooResourceUrl 指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是包含请求体和头部信息的 HttpEntity 对象,第三个参数是期望返回的对象类型,这里期望返回一个 Foo 类型的对象。

  4. Assertions.assertNotNull(foo);:使用断言来检查返回的 foo 对象是否不为 null,确保请求成功并且得到了响应。

  5. Assertions.assertEquals(foo.getName(), "bar");:再次使用断言来检查返回的 foo 对象的 name 属性是否等于 "bar",确保返回的对象包含了正确的数据。

2. postForLocation()

该方法用于发送 POST 请求,不返回完整的资源,只返回新创建资源的位置:

HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
URI location = restTemplate.postForLocation(fooResourceUrl, request);
Assertions.assertNotNull(location);

        这段代码展示了如何使用 RestTemplate 发送一个 POST 请求,并期望服务器响应中包含新创建资源的 URI。以下是代码的详细解释:

  1. HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));:创建了一个 HttpEntity 对象,它包含了要发送的数据(在这个例子中是一个 Foo 对象,其构造函数接收一个字符串参数 "bar")。HttpEntity 对象不仅包含请求体,还可以包含请求头信息,但在这个例子中没有显式设置任何请求头。

  2. URI location = restTemplate.postForLocation(fooResourceUrl, request);:使用 postForLocation 方法发送 POST 请求到 fooResourceUrl 指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是包含请求体的 HttpEntity 对象。与 postForObject 方法不同,postForLocation 方法不期望返回一个响应体,而是期望返回新创建资源的 URI。这个方法返回一个 URI 对象,表示新创建资源的位置。

  3. Assertions.assertNotNull(location);:使用断言来检查返回的 location 对象是否不为 null,确保请求成功并且服务器返回了新资源的位置。

        这个示例假设服务端接收 POST 请求后,会处理请求体中的数据,并创建一个新的资源。然后,服务器会在响应中包含一个 Location 头,指示新创建资源的 URI。RestTemplate 会自动从响应头中提取这个 Location 值,并将其作为 URI 对象返回。

3. exchange()

exchange 方法是一个更通用的 POST 请求方法,允许更灵活的请求配置:

RestTemplate restTemplate = new RestTemplate();
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
ResponseEntity<Foo> response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);
Foo foo = response.getBody();
Assertions.assertNotNull(foo);
Assertions.assertEquals(foo.getName(), "bar");

这段代码展示了如何使用 RestTemplate 发送一个 POST 请求,并检查响应状态码以及响应体。以下是代码的详细解释:

  1. RestTemplate restTemplate = new RestTemplate();:创建了 RestTemplate 的一个实例,用于执行 HTTP 请求。

  2. HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));:创建了一个 HttpEntity 对象,它包含了要发送的数据(在这个例子中是一个 Foo 对象,其构造函数接收一个字符串参数 "bar")。HttpEntity 对象不仅包含请求体,还可以包含请求头信息,但在这个例子中没有显式设置任何请求头。

  3. ResponseEntity<Foo> response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);:使用 exchange 方法发送 POST 请求到 fooResourceUrl 指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是请求的方法(这里是 HttpMethod.POST),第三个参数是包含请求体和头部信息的 HttpEntity 对象,第四个参数是期望返回的对象类型,这里期望返回一个 Foo 类型的对象。exchange 方法返回一个 ResponseEntity 对象,它包含了响应的状态码、响应头、响应体等信息。

  4. Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);:使用断言来检查响应的状态码是否等于 HttpStatus.CREATED(201),这通常表示资源创建成功。

  5. Foo foo = response.getBody();:从 ResponseEntity 对象中获取响应体,这里期望是一个 Foo 类型的对象。

  6. Assertions.assertNotNull(foo);:使用断言来检查返回的 foo 对象是否不为 null,确保请求成功并且得到了响应。

  7. Assertions.assertEquals(foo.getName(), "bar");:再次使用断言来检查返回的 foo 对象的 name 属性是否等于 "bar",确保返回的对象包含了正确的数据。

4. 提交表单数据

        使用 POST 方法提交表单数据,需要将 Content-Type 头设置为 application/x-www-form-urlencoded:

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("id", "1");HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity(fooResourceUrl+"/form", request, String.class);
Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);

这段代码展示了如何使用 RestTemplate 发送一个包含表单数据的 POST 请求,并验证响应状态码。以下是代码的详细解释:

  1. HttpHeaders headers = new HttpHeaders();:创建了一个 HttpHeaders 对象,用于设置 HTTP 请求的头部信息。

  2. headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);:设置请求的 Content-Type 头部为 application/x-www-form-urlencoded,这表明请求体中的数据是 URL 编码的表单数据。

  3. MultiValueMap<String, String> map = new LinkedMultiValueMap<>();:创建了一个 LinkedMultiValueMap 实例,用于存储表单数据。LinkedMultiValueMap 允许每个键对应多个值,但在这个例子中,我们只添加了一个值。

  4. map.add("id", "1");:向 map 中添加了一个键值对,键是 "id",值是 "1"。

  5. HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);:创建了一个 HttpEntity 对象,它包含了表单数据(map)和头部信息(headers)。

  6. ResponseEntity<String> response = restTemplate.postForEntity(fooResourceUrl+"/form", request, String.class);:使用 postForEntity 方法发送 POST 请求到 fooResourceUrl+"/form" 指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是包含请求体和头部信息的 HttpEntity 对象,第三个参数是期望返回的对象类型,这里期望返回一个 String 类型的对象。postForEntity 方法返回一个 ResponseEntity 对象,它包含了响应的状态码、响应头、响应体等信息。

  7. Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);:使用断言来检查响应的状态码是否等于 HttpStatus.CREATED(201),这通常表示资源创建成功。`

5. optionsForAllow()

使用 optionsForAllow 方法来获取指定 URL 上允许的操作(请求方法):

Set<HttpMethod> optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl);
HttpMethod[] supportedMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE};
Assertions.assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods)));

这段代码使用了 RestTemplateoptionsForAllow 方法来查询指定资源 URL 支持的 HTTP 方法,并验证这些方法是否包含在特定的一组方法中。以下是代码的详细解释:

  1. Set<HttpMethod> optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl);:调用 optionsForAllow 方法发送一个 HTTP OPTIONS 请求到 fooResourceUrl 指定的 URL。这个方法返回一个 Set<HttpMethod>,包含了服务器声明该资源支持的所有 HTTP 方法。

  2. HttpMethod[] supportedMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE};:定义了一个 HttpMethod 数组,包含了你期望服务器支持的方法。

  3. Assertions.assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods)));:使用断言来检查第一步中获取的 Set<HttpMethod> 是否包含了第二步中定义的所有 HTTP 方法。containsAll 方法会检查集合是否包含指定集合中的所有元素。

        这个示例假设你想要验证服务器是否支持 GET、POST、PUT 和 DELETE 这四种常见的 HTTP 方法。如果服务器对 fooResourceUrl 资源的响应中包含了 Allow 头部,其中列出了支持的方法,那么 optionsForAllow 方法将解析这个头部并返回相应的 HttpMethod 集合。

6. 使用 PUT 请求更新资源

使用 exchange() 发起简单的 PUT 请求,该请求没有响应体:

Foo updatedInstance = new Foo("newName");
updatedInstance.setId(createResponse.getBody().getId());
String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId();
HttpEntity<Foo> requestUpdate = new HttpEntity<>(updatedInstance, headers);
template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);

        这段代码展示了如何使用 RestTemplate 发送一个 HTTP PUT 请求来更新服务器上的资源。以下是代码的详细解释:

  1. Foo updatedInstance = new Foo("newName");:创建了一个新的 Foo 实例,并将其属性设置为 "newName"。

  2. updatedInstance.setId(createResponse.getBody().getId());:从之前创建资源时获得的响应(createResponse)中获取资源的 ID,并将其设置为更新实例的 ID。这确保了更新操作是针对特定的资源。

  3. String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId();:构建了包含资源 ID 的完整 URL,用于指定要更新的资源。

  4. HttpEntity<Foo> requestUpdate = new HttpEntity<>(updatedInstance, headers);:创建了一个 HttpEntity 对象,它包含了要更新的 Foo 实例和之前定义的 HTTP 头部信息(headers)。

  5. template.exchange(resourceUrl, HttpMethod.PUT, requestUpdate, Void.class);:使用 exchange 方法发送 PUT 请求到构建的资源 URL。这个方法的第一个参数是请求的 URL,第二个参数是请求的方法(这里是 HttpMethod.PUT),第三个参数是包含请求体和头部信息的 HttpEntity 对象,第四个参数是期望返回的对象类型,这里使用 Void.class 表示不期望返回任何内容(即服务器应该返回状态码,但不返回响应体)。

        这个示例假设服务端接收 PUT 请求后,会处理请求体中的数据,并更新指定 ID 的资源。通常,PUT 请求用于发送资源的完整更新,而 PATCH 请求用于发送资源的部分更新。

        请注意,这段代码中的 createResponse 是之前某个创建资源操作的响应,它包含了新创建资源的 ID。此外,headers 是之前定义的 HttpHeaders 实例,它可能包含了如 Content-Type 等必要的头部信息。

7. 上传文件

        上传文件时,Content-Type 为 multipart/form-data 类型。以下是上传单个文件的示例:

RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8080/chat16/test/form2";
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file1", new FileSystemResource(".\\src\\main\\java\\com\\javacode2018\\springmvc\\chat16\\dto\\UserDto.java"));
HttpHeaders headers = new HttpHeaders();
headers.add("header1", "v1");
headers.add("header2", "v2");
RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));
ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(requestEntity,new ParameterizedTypeReference<Map<String, String>>() {}
);
Map<String, String> result = responseEntity.getBody();
System.out.println(result);

这段代码展示了如何使用 RestTemplate 发送一个包含文件和其他表单数据的 HTTP POST 请求,并处理响应。以下是代码的详细解释:

  1. RestTemplate restTemplate = new RestTemplate();:创建了 RestTemplate 的一个实例,用于执行 HTTP 请求。

  2. String url = "http://localhost:8080/chat16/test/form2";:定义了请求的目标 URL。

  3. MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();:创建了一个 MultiValueMap 实例,用于存储请求体中的表单数据和文件。

  4. body.add("file1", new FileSystemResource(".\\src\\main\\java\\com\\javacode2018\\springmvc\\chat16\\dto\\UserDto.java"));:向 body 中添加了一个文件。这里使用的是 FileSystemResource,它表示一个文件系统中的资源。

  5. HttpHeaders headers = new HttpHeaders();:创建了一个 HttpHeaders 对象,用于设置 HTTP 请求的头部信息。

  6. headers.add("header1", "v1");headers.add("header2", "v2");:向请求头部添加了两个自定义的头部字段。

  7. RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));:创建了一个 RequestEntity 对象,它包含了请求体、头部信息、请求方法(这里是 POST)和请求的 URI。

  8. ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(requestEntity, new ParameterizedTypeReference<Map<String, String>>() {});:使用 exchange 方法发送请求并接收响应。这里使用了 RequestEntity 作为请求参数,并且指定了响应体期望的类型是一个 Map<String, String>

  9. Map<String, String> result = responseEntity.getBody();:从响应实体中获取响应体,这里期望是一个 Map 类型的对象。

  10. System.out.println(result);:打印出响应体的内容。

这个示例中,exchange 方法被用来发送一个包含文件和其他表单数据的 POST 请求。由于文件数据是多部分的,所以不需要手动设置 Content-Typemultipart/form-dataRestTemplate 会自动处理。但是,如果需要自定义多部分请求的边界,可以通过设置 HttpHeadersContent-Type 属性来实现。

请注意,这段代码中的 new ParameterizedTypeReference<Map<String, String>>() {} 是一个泛型类型参考,它用于指定响应体的泛型类型。这是必要的,因为 Java 的类型擦除机制会在运行时移除泛型信息。

最后,确保服务器端的 URL 能够处理多部分表单数据,并且能够正确响应。如果服务器返回的不是 Map<String, String> 类型的数据,你需要修改 ParameterizedTypeReference 以匹配实际的响应类型。

相关文章:

RestTemplate 常用方法(提供了多种方法来发送 HTTP 请求)

RestTemplate 是 Spring 框架中用于同步客户端 HTTP 请求的一个类&#xff0c;它提供了多种方法来发送 HTTP 请求。以下是一些常用的 RestTemplate 方法及其代码案例&#xff1a; 1.postForObject() 该方法用于发送 POST 请求&#xff0c;并期望返回一个对象。以下是一个使用…...

常量和变量

常量 常量是指在程序中使用的一些具体的数、字符。在程序运行过程中&#xff0c;其值不能被更改。如123,145.88,m,TRUE等。常量&#xff0c;用于记录程序中不可更改的数据。 分类 1、整型常量&#xff0c;表示整数的常量。 表示形式&#xff1a;   1&#xff09;十进制形…...

Go语言的使用

在安装Go和配置镜像时&#xff0c;可以根据操作系统和网络环境来选择适合的步骤。以下是详细的安装步骤和镜像配置&#xff1a; 1. 安装Go 1.1 通过官方下载 访问 Go的官方下载页面 下载适合操作系统的安装包&#xff08;Windows、macOS 或 Linux&#xff09;。安装包下载完…...

详解CRC校验原理以及FPGA实现

文章目录 一、什么是CRC校验&#xff1f;二、实现CRC校验原理以及步骤2.1 用多项式表示二元码数据2.2 选择一个生成多项式作为校验2.3 计算CRC校验码 三、CRC判断数据是否错误的原理以及步骤3.1 将收到的数据与生成多项式求余3.2 数据发生错误再进行CRC校验判断 四、FPGA实现CR…...

企业如何通过架构蓝图实现数字化转型

数字化转型的关键——架构蓝图的力量 在当今的商业世界&#xff0c;数字化转型已经不再是一个选择&#xff0c;而是企业生存与发展不可回避的战略行动。企业希望通过数字化提高效率、增强灵活性&#xff0c;并为客户提供更好的体验。然而&#xff0c;数字化转型不仅仅涉及技术…...

React第十三章(useTransition)

useTransition useTransition 是 React 18 中引入的一个 Hook&#xff0c;用于管理 UI 中的过渡状态&#xff0c;特别是在处理长时间运行的状态更新时。它允许你将某些更新标记为“过渡”状态&#xff0c;这样 React 可以优先处理更重要的更新&#xff0c;比如用户输入&#x…...

IDEA使用Maven Helper查看整个项目的jar冲突

在插件市场安装Maven Helper&#xff0c;安装好后&#xff0c;重启IDEA&#xff1b;双击打开可能存在jar冲突的pom文件&#xff1b;在右侧面板查看冲突,text是引入的依赖明细&#xff0c;点击Dependecy Analyzer选项卡即可查看冲突的jar。...

uniapp项目 存储数据到手机本地

打开manifest.json&#xff0c;在App权限配置中&#xff0c;添加读取和写入的权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...

景联文科技医疗数据处理平台:强化医疗数据标注与管理,推动医疗数字化新篇章

随着医疗科技快速进步与广泛应用&#xff0c;医疗信息的规模正在迅速扩张&#xff0c;如何有效管理这些医疗数据成为了关键议题。 医疗数据不仅包括传统的纸质病历&#xff0c;还有电子病历、实验室检测结果、医学影像等多样化的数字信息。为确保这些数据能为临床决策、科研分析…...

vue使用高德地图实现轨迹显隐

<template><div><el-button type"primary" click"pathShowOrHide">轨迹显/隐</el-button><div id"container" /></div> </template><script> import AMapLoader from amap/amap-jsapi-loaderex…...

Maven(20) 如何使用Maven进行版本管理?

Maven提供了一套强大的版本管理机制&#xff0c;允许开发者管理项目的版本号&#xff0c;并在不同的版本之间进行升级和降级。以下是如何使用Maven进行版本管理的详细步骤和代码示例&#xff1a; 步骤 1: 定义项目版本 在pom.xml文件中&#xff0c;你需要定义项目的版本号。版…...

AWS RDS MySQL内存使用

1. AWS RDS所拥有的内存&#xff08;实例类型&#xff09;&#xff0c;和数据库能够使用的内存是不同的。RDS实例为操作系统和 RDS 管理进程预留了内存&#xff0c;数据库使用内存大小&#xff0c;小于数据库实例类的硬件规格中所示的值&#xff08;以 GiB 为单位&#xff09;[…...

Vue指令:v-else、v-else-if

目录 1.语法&#xff1a; 2. 题目 3.页面展示 4.结构 1.语法&#xff1a; 1.作用&#xff1a;辅助v-if进行判断渲染 2.语法&#xff1a;v-else 、v-esle-if"表达式" 2. 题目 <!DOCTYPE html> <html lang"en"> <head><meta chars…...

基于SSM志愿者招募系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;志愿组织管理&#xff0c;组织信息管理&#xff0c;组织申请管理&#xff0c;志愿活动管理活动报名管理 用户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;…...

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法&#xff0c;它们不仅帮助我们理解和描述复杂系统的行为&#xff0c;还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发&#xff0c;逐步深入到各种优化算法&#xff0c;并探讨它们在实际问题中的应用。 思维导图文件可获取&#xff1a;https:…...

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…...

自由软件与开源软件:异同与联系

自由软件与开源软件&#xff1a;异同与联系 随着信息技术的快速发展&#xff0c;自由软件运动与开源软件运动成为推动软件开发领域变革的重要力量。虽然这两个概念在日常对话中常被交替使用&#xff0c;但它们各自有着不同的理念和发展历程。本文将探讨自由软件运动与开源软件…...

Vue中ref、reactive、toRef、toRefs的区别

一、ref、reactive setup 函数中默认定义的变量并不是响应式的&#xff08;即数据变了以后页面不会跟着变&#xff09;&#xff0c;如果想让变量变为响应式的变量&#xff0c;需要使用 ref 和 reactive 函数修饰变量。 ref 函数可以把基本类型变量变为响应式引用reactive 函数…...

凸极式发电机的相量图分析和计算,内功率因数角和外功率因数角和功角的定义。

图1&#xff1a;同步发电机稳态相量图 若发电机为凸极式&#xff0c;由于凸极机正、交轴同步电抗不等&#xff0c;即xd≠xq&#xff0c;因此必须先借助虚构电动势 E ˙ Q E ˙ q − ( x d − x q ) I ˙ d \dot{E}_Q\dot{E}_q-(x_d-x_q)\dot{I}_d E˙Q​E˙q​−(xd​−xq​)…...

systemctl restart NetworkManager 重启后,文件/etc/resolv.conf修改失败

如果你在重启 NetworkManager 之后发现无法修改 /etc/resolv.conf 文件,这是因为 NetworkManager 会自动管理这个文件 为了解决这个问题,你可以采取以下两种方法之一: 方法一:禁用 NetworkManager 服务 使用以下命令停止 NetworkManager 服务:sudo systemctl stop Netwo…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...

scan_mode设计原则

scan_mode设计原则 在进行mtp controller设计时&#xff0c;基本功能设计完成后&#xff0c;需要设计scan_mode设计。 1、在进行scan_mode设计时&#xff0c;需要保证mtp处于standby模式&#xff0c;不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可&#xf…...

Go爬虫开发学习记录

Go爬虫开发学习记录 基础篇&#xff1a;使用net/http库 Go的标准库net/http提供了完善的HTTP客户端功能&#xff0c;是构建爬虫的基石&#xff1a; package mainimport ("fmt""io""net/http" )func fetchPage(url string) string {// 创建自定…...

Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南

Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南 在金融行业安全审计中&#xff0c;未启用HTTPS的Web应用被列为高危漏洞。通过正确配置HTTPS&#xff0c;可将中间人攻击风险降低98%——本文将全面解析Spring Boot中HTTPS的实现方案与实战避坑指南。 一、HTTPS 核心原理与…...

如何在Spring Boot中使用注解动态切换实现

还在用冗长的if-else或switch语句管理多个服务实现? 相信不少Spring Boot开发者都遇到过这样的场景:需要根据不同条件动态选择不同的服务实现。 如果告诉你可以完全摆脱条件判断,让Spring自动选择合适的实现——只需要一个注解,你是否感兴趣? 本文将详细介绍这种优雅的…...

LeetCode第244题_最短单词距离II

LeetCode第244题&#xff1a;最短单词距离II 问题描述 设计一个类&#xff0c;接收一个单词数组 wordsDict&#xff0c;并实现一个方法&#xff0c;该方法能够计算两个不同单词在该数组中出现位置的最短距离。 你需要实现一个 WordDistance 类: WordDistance(String[] word…...

【学习记录】Office 和 WPS 文档密码破解实战

文章目录 &#x1f4cc; 引言&#x1f4c1; Office 与 WPS 支持的常见文件格式Microsoft Office 格式WPS Office 格式 &#x1f6e0; 所需工具下载地址&#xff08;Windows 官方编译版&#xff09;&#x1f510; 破解流程详解步骤 1&#xff1a;提取文档的加密哈希值步骤 2&…...

Fetch API 使用详解:Bearer Token 与 localStorage 实践

Fetch API&#xff1a;现代浏览器内置的用于发送 HTTP 请求的 API&#xff0c;Bearer Token&#xff1a;一种基于令牌的身份验证方案&#xff0c;常用于 JWT 认证&#xff0c;localStorage&#xff1a;浏览器提供的持久化存储方案&#xff0c;用于在客户端存储数据。 token是我…...

【鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件,可以使用鸿蒙的文件系统 API】

鸿蒙在 ETS (Extendable TypeScript) 中创建多级目录或文件&#xff0c;可以使用鸿蒙的文件系统 API。 // 导入需要的模块 import fs from ohos.file.fs;const TAG"Index" Entry Component struct Index {State message: string Hello World;build() {Row() {Colum…...