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");
-
RestTemplate restTemplate = new RestTemplate();:创建了RestTemplate的一个实例,用于执行 HTTP 请求。 -
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));:创建了一个HttpEntity对象,它包含了要发送的数据(在这个例子中是一个Foo对象,其构造函数接收一个字符串参数 "bar")和 HTTP 头部信息(在这个例子中头部信息是空的,因为HttpEntity的构造函数没有接收任何头部信息参数)。 -
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);:使用postForObject方法发送 POST 请求到fooResourceUrl指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是包含请求体和头部信息的HttpEntity对象,第三个参数是期望返回的对象类型,这里期望返回一个Foo类型的对象。 -
Assertions.assertNotNull(foo);:使用断言来检查返回的foo对象是否不为null,确保请求成功并且得到了响应。 -
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。以下是代码的详细解释:
-
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));:创建了一个HttpEntity对象,它包含了要发送的数据(在这个例子中是一个Foo对象,其构造函数接收一个字符串参数 "bar")。HttpEntity对象不仅包含请求体,还可以包含请求头信息,但在这个例子中没有显式设置任何请求头。 -
URI location = restTemplate.postForLocation(fooResourceUrl, request);:使用postForLocation方法发送 POST 请求到fooResourceUrl指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是包含请求体的HttpEntity对象。与postForObject方法不同,postForLocation方法不期望返回一个响应体,而是期望返回新创建资源的 URI。这个方法返回一个URI对象,表示新创建资源的位置。 -
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 请求,并检查响应状态码以及响应体。以下是代码的详细解释:
-
RestTemplate restTemplate = new RestTemplate();:创建了RestTemplate的一个实例,用于执行 HTTP 请求。 -
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));:创建了一个HttpEntity对象,它包含了要发送的数据(在这个例子中是一个Foo对象,其构造函数接收一个字符串参数 "bar")。HttpEntity对象不仅包含请求体,还可以包含请求头信息,但在这个例子中没有显式设置任何请求头。 -
ResponseEntity<Foo> response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);:使用exchange方法发送 POST 请求到fooResourceUrl指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是请求的方法(这里是HttpMethod.POST),第三个参数是包含请求体和头部信息的HttpEntity对象,第四个参数是期望返回的对象类型,这里期望返回一个Foo类型的对象。exchange方法返回一个ResponseEntity对象,它包含了响应的状态码、响应头、响应体等信息。 -
Assertions.assertEquals(response.getStatusCode(), HttpStatus.CREATED);:使用断言来检查响应的状态码是否等于HttpStatus.CREATED(201),这通常表示资源创建成功。 -
Foo foo = response.getBody();:从ResponseEntity对象中获取响应体,这里期望是一个Foo类型的对象。 -
Assertions.assertNotNull(foo);:使用断言来检查返回的foo对象是否不为null,确保请求成功并且得到了响应。 -
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 请求,并验证响应状态码。以下是代码的详细解释:
-
HttpHeaders headers = new HttpHeaders();:创建了一个HttpHeaders对象,用于设置 HTTP 请求的头部信息。 -
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);:设置请求的Content-Type头部为application/x-www-form-urlencoded,这表明请求体中的数据是 URL 编码的表单数据。 -
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();:创建了一个LinkedMultiValueMap实例,用于存储表单数据。LinkedMultiValueMap允许每个键对应多个值,但在这个例子中,我们只添加了一个值。 -
map.add("id", "1");:向map中添加了一个键值对,键是 "id",值是 "1"。 -
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);:创建了一个HttpEntity对象,它包含了表单数据(map)和头部信息(headers)。 -
ResponseEntity<String> response = restTemplate.postForEntity(fooResourceUrl+"/form", request, String.class);:使用postForEntity方法发送 POST 请求到fooResourceUrl+"/form"指定的 URL。这个方法的第一个参数是请求的 URL,第二个参数是包含请求体和头部信息的HttpEntity对象,第三个参数是期望返回的对象类型,这里期望返回一个String类型的对象。postForEntity方法返回一个ResponseEntity对象,它包含了响应的状态码、响应头、响应体等信息。 -
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)));
这段代码使用了 RestTemplate 的 optionsForAllow 方法来查询指定资源 URL 支持的 HTTP 方法,并验证这些方法是否包含在特定的一组方法中。以下是代码的详细解释:
-
Set<HttpMethod> optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl);:调用optionsForAllow方法发送一个 HTTP OPTIONS 请求到fooResourceUrl指定的 URL。这个方法返回一个Set<HttpMethod>,包含了服务器声明该资源支持的所有 HTTP 方法。 -
HttpMethod[] supportedMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE};:定义了一个HttpMethod数组,包含了你期望服务器支持的方法。 -
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 请求来更新服务器上的资源。以下是代码的详细解释:
-
Foo updatedInstance = new Foo("newName");:创建了一个新的Foo实例,并将其属性设置为 "newName"。 -
updatedInstance.setId(createResponse.getBody().getId());:从之前创建资源时获得的响应(createResponse)中获取资源的 ID,并将其设置为更新实例的 ID。这确保了更新操作是针对特定的资源。 -
String resourceUrl = fooResourceUrl + '/' + createResponse.getBody().getId();:构建了包含资源 ID 的完整 URL,用于指定要更新的资源。 -
HttpEntity<Foo> requestUpdate = new HttpEntity<>(updatedInstance, headers);:创建了一个HttpEntity对象,它包含了要更新的Foo实例和之前定义的 HTTP 头部信息(headers)。 -
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 请求,并处理响应。以下是代码的详细解释:
-
RestTemplate restTemplate = new RestTemplate();:创建了RestTemplate的一个实例,用于执行 HTTP 请求。 -
String url = "http://localhost:8080/chat16/test/form2";:定义了请求的目标 URL。 -
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();:创建了一个MultiValueMap实例,用于存储请求体中的表单数据和文件。 -
body.add("file1", new FileSystemResource(".\\src\\main\\java\\com\\javacode2018\\springmvc\\chat16\\dto\\UserDto.java"));:向body中添加了一个文件。这里使用的是FileSystemResource,它表示一个文件系统中的资源。 -
HttpHeaders headers = new HttpHeaders();:创建了一个HttpHeaders对象,用于设置 HTTP 请求的头部信息。 -
headers.add("header1", "v1");和headers.add("header2", "v2");:向请求头部添加了两个自定义的头部字段。 -
RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));:创建了一个RequestEntity对象,它包含了请求体、头部信息、请求方法(这里是 POST)和请求的 URI。 -
ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(requestEntity, new ParameterizedTypeReference<Map<String, String>>() {});:使用exchange方法发送请求并接收响应。这里使用了RequestEntity作为请求参数,并且指定了响应体期望的类型是一个Map<String, String>。 -
Map<String, String> result = responseEntity.getBody();:从响应实体中获取响应体,这里期望是一个Map类型的对象。 -
System.out.println(result);:打印出响应体的内容。
这个示例中,exchange 方法被用来发送一个包含文件和其他表单数据的 POST 请求。由于文件数据是多部分的,所以不需要手动设置 Content-Type 为 multipart/form-data,RestTemplate 会自动处理。但是,如果需要自定义多部分请求的边界,可以通过设置 HttpHeaders 的 Content-Type 属性来实现。
请注意,这段代码中的 new ParameterizedTypeReference<Map<String, String>>() {} 是一个泛型类型参考,它用于指定响应体的泛型类型。这是必要的,因为 Java 的类型擦除机制会在运行时移除泛型信息。
最后,确保服务器端的 URL 能够处理多部分表单数据,并且能够正确响应。如果服务器返回的不是 Map<String, String> 类型的数据,你需要修改 ParameterizedTypeReference 以匹配实际的响应类型。
相关文章:
RestTemplate 常用方法(提供了多种方法来发送 HTTP 请求)
RestTemplate 是 Spring 框架中用于同步客户端 HTTP 请求的一个类,它提供了多种方法来发送 HTTP 请求。以下是一些常用的 RestTemplate 方法及其代码案例: 1.postForObject() 该方法用于发送 POST 请求,并期望返回一个对象。以下是一个使用…...
常量和变量
常量 常量是指在程序中使用的一些具体的数、字符。在程序运行过程中,其值不能被更改。如123,145.88,m,TRUE等。常量,用于记录程序中不可更改的数据。 分类 1、整型常量,表示整数的常量。 表示形式: 1)十进制形…...
Go语言的使用
在安装Go和配置镜像时,可以根据操作系统和网络环境来选择适合的步骤。以下是详细的安装步骤和镜像配置: 1. 安装Go 1.1 通过官方下载 访问 Go的官方下载页面 下载适合操作系统的安装包(Windows、macOS 或 Linux)。安装包下载完…...
详解CRC校验原理以及FPGA实现
文章目录 一、什么是CRC校验?二、实现CRC校验原理以及步骤2.1 用多项式表示二元码数据2.2 选择一个生成多项式作为校验2.3 计算CRC校验码 三、CRC判断数据是否错误的原理以及步骤3.1 将收到的数据与生成多项式求余3.2 数据发生错误再进行CRC校验判断 四、FPGA实现CR…...
企业如何通过架构蓝图实现数字化转型
数字化转型的关键——架构蓝图的力量 在当今的商业世界,数字化转型已经不再是一个选择,而是企业生存与发展不可回避的战略行动。企业希望通过数字化提高效率、增强灵活性,并为客户提供更好的体验。然而,数字化转型不仅仅涉及技术…...
React第十三章(useTransition)
useTransition useTransition 是 React 18 中引入的一个 Hook,用于管理 UI 中的过渡状态,特别是在处理长时间运行的状态更新时。它允许你将某些更新标记为“过渡”状态,这样 React 可以优先处理更重要的更新,比如用户输入&#x…...
IDEA使用Maven Helper查看整个项目的jar冲突
在插件市场安装Maven Helper,安装好后,重启IDEA;双击打开可能存在jar冲突的pom文件;在右侧面板查看冲突,text是引入的依赖明细,点击Dependecy Analyzer选项卡即可查看冲突的jar。...
uniapp项目 存储数据到手机本地
打开manifest.json,在App权限配置中,添加读取和写入的权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...
景联文科技医疗数据处理平台:强化医疗数据标注与管理,推动医疗数字化新篇章
随着医疗科技快速进步与广泛应用,医疗信息的规模正在迅速扩张,如何有效管理这些医疗数据成为了关键议题。 医疗数据不仅包括传统的纸质病历,还有电子病历、实验室检测结果、医学影像等多样化的数字信息。为确保这些数据能为临床决策、科研分析…...
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提供了一套强大的版本管理机制,允许开发者管理项目的版本号,并在不同的版本之间进行升级和降级。以下是如何使用Maven进行版本管理的详细步骤和代码示例: 步骤 1: 定义项目版本 在pom.xml文件中,你需要定义项目的版本号。版…...
AWS RDS MySQL内存使用
1. AWS RDS所拥有的内存(实例类型),和数据库能够使用的内存是不同的。RDS实例为操作系统和 RDS 管理进程预留了内存,数据库使用内存大小,小于数据库实例类的硬件规格中所示的值(以 GiB 为单位)[…...
Vue指令:v-else、v-else-if
目录 1.语法: 2. 题目 3.页面展示 4.结构 1.语法: 1.作用:辅助v-if进行判断渲染 2.语法:v-else 、v-esle-if"表达式" 2. 题目 <!DOCTYPE html> <html lang"en"> <head><meta chars…...
基于SSM志愿者招募系统的设计
管理员账户功能包括:系统首页,个人中心,用户管理,志愿组织管理,组织信息管理,组织申请管理,志愿活动管理活动报名管理 用户账号功能包括:系统首页,个人中心,…...
数学建模与优化算法:从基础理论到实际应用
数学建模和优化算法,它们不仅帮助我们理解和描述复杂系统的行为,还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发,逐步深入到各种优化算法,并探讨它们在实际问题中的应用。 思维导图文件可获取:https:…...
微信小程序生成二维码
目前是在开发小程序端 --> 微信小程序。然后接到需求:根据 form 表单填写内容生成二维码(第一版:表单目前需要客户进行自己输入,然后点击生成按钮实时生成二维码,不需要向后端请求,不存如数据库…...
自由软件与开源软件:异同与联系
自由软件与开源软件:异同与联系 随着信息技术的快速发展,自由软件运动与开源软件运动成为推动软件开发领域变革的重要力量。虽然这两个概念在日常对话中常被交替使用,但它们各自有着不同的理念和发展历程。本文将探讨自由软件运动与开源软件…...
Vue中ref、reactive、toRef、toRefs的区别
一、ref、reactive setup 函数中默认定义的变量并不是响应式的(即数据变了以后页面不会跟着变),如果想让变量变为响应式的变量,需要使用 ref 和 reactive 函数修饰变量。 ref 函数可以把基本类型变量变为响应式引用reactive 函数…...
凸极式发电机的相量图分析和计算,内功率因数角和外功率因数角和功角的定义。
图1:同步发电机稳态相量图 若发电机为凸极式,由于凸极机正、交轴同步电抗不等,即xd≠xq,因此必须先借助虚构电动势 E ˙ Q E ˙ q − ( x d − x q ) I ˙ d \dot{E}_Q\dot{E}_q-(x_d-x_q)\dot{I}_d E˙QE˙q−(xd−xq)…...
systemctl restart NetworkManager 重启后,文件/etc/resolv.conf修改失败
如果你在重启 NetworkManager 之后发现无法修改 /etc/resolv.conf 文件,这是因为 NetworkManager 会自动管理这个文件 为了解决这个问题,你可以采取以下两种方法之一: 方法一:禁用 NetworkManager 服务 使用以下命令停止 NetworkManager 服务:sudo systemctl stop Netwo…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...
视觉slam--框架
视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图? 建图并没有一个固定的形式和算法…...
