当前位置: 首页 > 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…...

Ostrakon-VL扫描终端实战教程:像素特工式零售图像识别部署指南

Ostrakon-VL扫描终端实战教程&#xff1a;像素特工式零售图像识别部署指南 1. 像素特工终端介绍 想象你是一位未来世界的零售侦探&#xff0c;手持高科技扫描仪在商店里穿梭。Ostrakon-VL扫描终端就是你的数字助手&#xff0c;它能帮你"看"懂货架上的每一个细节。这…...

jsDelivr CDN:如何为你的开源项目选择最佳加速方案

1. 为什么你的开源项目需要jsDelivr CDN 作为一个开源项目维护者&#xff0c;我深刻理解静态资源加载速度对用户体验的影响。去年我的一个Vue组件库项目就遇到过这样的问题&#xff1a;海外用户访问飞快&#xff0c;但国内用户总是抱怨加载缓慢。直到我把资源托管到jsDelivr&am…...

猫抓插件深度解析:浏览器资源嗅探的终极实战指南

猫抓插件深度解析&#xff1a;浏览器资源嗅探的终极实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓插件是一款功能强大的开源浏览器扩…...

多品种小批量时代的排产革命:JVS-APS智能排产突破交付周期瓶颈

"紧急订单插入&#xff0c;全产线排程推倒重来"、"设备冲突、物料短缺让排产计划沦为纸上谈兵"、"明明产能充足&#xff0c;订单交付周期却比同行长30%"——这些困境正在困扰着越来越多的制造企业。在现代制造业中&#xff0c;多品种小批量生产模…...

7步掌握MetaGPT:从单行需求到完整软件的多智能体革命

7步掌握MetaGPT&#xff1a;从单行需求到完整软件的多智能体革命 【免费下载链接】MetaGPT &#x1f31f; The Multi-Agent Framework: First AI Software Company, Towards Natural Language Programming 项目地址: https://gitcode.com/GitHub_Trending/me/MetaGPT 想…...

ArduinoLog:面向MCU的零开销C++嵌入式日志框架

1. ArduinoLog 项目概述ArduinoLog 是一款专为 Arduino 及兼容嵌入式平台&#xff08;包括 AVR、SAM、ESP8266 等&#xff09;设计的轻量级 C 日志框架。其核心设计哲学是“零运行时开销、零动态内存分配、全编译期可控”&#xff0c;在资源极度受限的微控制器环境中&#xff0…...

【读书笔记】《在远远的背后带领》

《在远远的背后带领》书话整理书名由来 "在远远的背后带领"这个书名&#xff0c;源于作者对十余年养育实践的回顾与思考。她发现&#xff0c;父母养育孩子容易走两个极端&#xff1a; 过度控制&#xff1a;强迫孩子按照自己的想法行事&#xff0c;结果双方俱疲&#…...

华为交换机等保2.0实战:手把手配置身份鉴别,从密码策略到登录超时

华为交换机等保2.0身份鉴别全流程配置指南 当企业网络面临等保2.0合规检查时&#xff0c;身份鉴别环节往往是整改重点。作为网络安全工程师&#xff0c;我曾协助多家企业通过等保测评&#xff0c;发现华为交换机的身份鉴别配置存在不少易忽略的细节。本文将分享一套经过实战验证…...

从豆瓣到StyleTalk:手把手教你用真实场景数据微调你的中文对话模型

从豆瓣到StyleTalk&#xff1a;手把手教你用真实场景数据微调你的中文对话模型 当你已经掌握了基座模型微调的基础技能&#xff0c;如何让模型真正理解特定领域的专业术语&#xff0c;或是模仿某种独特的说话风格&#xff1f;本文将带你深入实战&#xff0c;从数据清洗到效果评…...

SQL Server服务启动失败?手把手教你用Local System账户解决SQLEXPRESS报错126

SQL Server服务启动失败&#xff1f;手把手教你用Local System账户解决SQLEXPRESS报错126 当你正准备开始一天的工作&#xff0c;突然发现SQL Server服务无法启动&#xff0c;屏幕上赫然显示着错误代码126&#xff0c;这种突如其来的技术故障往往让人措手不及。作为数据库管理员…...