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 以匹配实际的响应类型。

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

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

相关文章

证书下行,这些高质量IT证书仍值得考

在快速变化的信息技术领域&#xff0c;专业认证不仅证明了个人的专业技能&#xff0c;还常常是许多企业在招聘时考虑的重要标准&#xff0c;因此很多IT朋友都会选择考一本证书来傍身。 然而&#xff0c;随着技术的发展和市场的变化&#xff0c;并不是所有的IT证书都能保持其原有…

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

【开源免费】基于SpringBoot+Vue.JS新闻推荐系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 056 &#xff0c;文末自助获取源码 \color{red}{T056&#xff0c;文末自助获取源码} T056&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…

【MySQL】架构

1. MySQL架构基本理解 与餐厅就餐类比理解 每次数据库查询就像一次餐厅服务 应用程序发出查询相当于点菜MySQL解析和执行查询&#xff0c;后厨根据订单制作食物事务管理保证数据的一致性&#xff0c;类似于结账的时候保证账单正确查询的时候考虑优化器&#xff0c;类似于厨师选…

Linux服务器或Linux计算机设置不记录历史命令

1.设置环境变量 打开命令终端&#xff0c;编辑.bashrc文件中&#xff0c;修改HISTSIZE和HISTFILESIZE都为0 sudo nano ~/.bashrcfor setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE0 HISTFILESIZE0 2.生效 source ~/.bashrc 3.验证 cat ./b…

基于Spring Boot的中小型制造企业质量管理系统设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

动手学深度学习65 注意力分数

1. 注意力分数 好处&#xff1a;k q v的长度都可以不一样。 2. 代码 3. QA 1 画出注意力权重&#xff0c;对任何一行query&#xff0c;给每一对key-value多少注意力【哪对key-value更重要】 2 语义上的区别 3 是的。一元版本换成向量版本 4 通常用相似度做注意力分数&…

从新手到专家:7款电脑平面设计软件评测

平面设计在时尚、广告等多个领域扮演着重要角色&#xff0c;而创作出独特且富有创意的设计作品则需要依赖优秀的电脑平面设计软件。市场上的电脑平面设计软件众多&#xff0c;每款软件都有其独到之处。本文将为你推荐几款值得关注的电脑平面设计软件&#xff0c;并分析它们的特…

HTML 块级元素和内联(行内)元素详解

在 HTML 中,元素根据它们在页面中的表现方式分为两类:块级元素 和 内联元素(行内元素)。了解块级元素和内联元素的特性与使用方法,是掌握HTML开发的重要基础。本文将深入探讨这两类元素的特点及其在实际开发中的应用。 文章目录 一、块级元素1.1 块级元素是什么?1.2 块级…

微信支付宝小程序SEO优化的四大策略

在竞争激烈的小程序市场中&#xff0c;高搜索排名意味着更多的曝光机会和潜在用户。SEO即搜索引擎优化&#xff0c;对于小程序而言&#xff0c;主要指的是在微信小程序商店中提高搜索排名&#xff0c;从而增加曝光度和用户访问量。有助于小程序脱颖而出&#xff0c;提升品牌知名…

内存马浅析

之前在jianshu上写了很多博客&#xff0c;但是安全相关的最近很多都被锁了。所以准备陆陆续续转到csdn来。内存马前几年一直是个很热门的漏洞攻击手段&#xff0c;因为相对于落地的木马&#xff0c;无文件攻击的内存马隐蔽性、持久性更强&#xff0c;适用的漏洞场景也更多。 J…

【网络】套接字编程——TCP通信

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;TCP网络服务器简单模拟实现。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;…

CytoSPACE·空转和单细胞数据的高分辨率比对

1. 准备输入文件&#xff0c;需要四个文件&#xff0c;所有文件都应以制表符分隔的表格输入格式 (.txt) 提供。 a. scRNA-seq 基因表达文件 矩阵必须是基因&#xff08;行&#xff09;乘以细胞&#xff08;列&#xff09;。 第一行必须包含单个细胞 ID&#xff0c;第一列必须…

模型 定位地图

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。心智导航现实的空间图。 1 定位地图模型的应用 1.1 小玉的职业定位与发展规划 小玉&#xff0c;24岁&#xff0c;市场营销专业本科毕业生&#xff0c;有半年汽车销售实习经历。毕业后&#xff0c;她…

规划误差降低27%,碰撞率降低33%Senna: 大规模视觉-语言模型与端到端自动驾驶相结合

Abstract 端到端自动驾驶在大规模数据中展示了强大的规划能力&#xff0c;但在复杂、罕见的场景中仍然因常识有限而表现不佳。相比之下&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在场景理解和推理方面表现出色。前进的方向在于融合两者的优势。以往利用LVLMs…

深入浅出 | 谈谈MNN GPU性能优化策略

MNN(Mobile Neural Network)是一个高性能、通用的深度学习框架&#xff0c;支持在移动端、PC端、服务端、嵌入式等各种设备上高效运行。MNN利用设备的GPU能力&#xff0c;全面充分“榨干”设备的GPU资源&#xff0c;来进行深度学习的高性能部署与训练。 概述 MNN自开源以来&a…

UE 引入 IOS framework库的坑

一、我明明已经把framework库进行签名的却在 上传到开发者后台时一直报错 90034 签章遗失 或者 未签 这个问题我最近遇到 极其坑爹 我是这个情况 这是我的framework库的目录 关键就在这了 多出了这个文件 就影响了 上传到开发者后台 就报错 90034 将其删除就好 &…

Rust 力扣 - 3090. 每个字符最多出现两次的最长子字符串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题使用滑动窗口进行求解&#xff0c;使用左指针和右指针分别表示窗口的左边界和窗口的右边界&#xff0c;使用哈希表记录窗口内的字符及其对应数量 我们首先向右移动右指针&#xff0c;将字符加入到哈希表中进…

Spring Boot框架下的信息学科平台系统开发实战

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于保密信息学科平台系统的开发全过程。通过分析基于保密信息学科平台系统管理的不足&#xff0c;创建了一个计算机管理基于保密信息学科平台系统的方案。文章介…