RestTemplate 使用教程

news2024/11/28 7:37:01

RestTemplate 是 Spring 框架提供的一种用于执行HTTP请求的同步客户端。它简化了与HTTP服务器的交互,并支持RESTful Web服务。

1. 添加依赖

首先,确保你的项目中包含了Spring Web的支持。如果你使用的是Maven,在pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 创建 RestTemplate 实例

你可以直接通过构造函数创建一个 RestTemplate 对象,或者更推荐地,利用RestTemplateBuilder 来构建,这样可以更容易地配置如超时时间等属性。

直接创建:

RestTemplate restTemplate = new RestTemplate();

在 Spring 应用中自动装配 RestTemplate

@Autowired
private RestTemplate restTemplate;

使用 RestTemplateBuilder 创建:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            .setConnectTimeout(Duration.ofMillis(3000))
            .setReadTimeout(Duration.ofMillis(3000))
            .build();
}

3. 发送 GET 请求

  • 获取简单类型数据:
String result = restTemplate.getForObject("http://example.com/api/data", String.class);
System.out.println(result);
  • 获取复杂对象:
DataObject data = restTemplate.getForObject("http://example.com/api/data", DataObject.class);
  • 使用参数:
Map<String, String> params = Collections.singletonMap("id", "42");
DataObject data = restTemplate.getForObject("http://example.com/api/data/{id}", DataObject.class, params);

4. 发送POST请求

  • 发送简单的表单数据:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("key1", "value1");
map.add("key2", "value2");

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers);

ResponseEntity<String> response = restTemplate.postForEntity("http://example.com/api/submit", request, String.class);
  • 发送JSON数据:
MyRequestObject obj = new MyRequestObject();
obj.setField1("value1");

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<MyRequestObject> entity = new HttpEntity<>(obj, headers);

ResponseEntity<String> response = restTemplate.postForEntity("http://example.com/api/submit", entity, String.class);

5.发送 DELETE 请求

DELETE 请求通常用于删除资源。你可以使用 delete 方法来发送一个简单的 DELETE 请求,或者使用 exchange 方法来更灵活地控制请求头等信息。 

  • 简单 DELETE 请求:
restTemplate.delete("http://example.com/api/resource/42");
  • 带参数的 DELETE 请求:

 如果需要传递额外的参数,可以使用 UriComponentsBuilder 来构建 URL。

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com/api/resource/{id}")
    .queryParam("param1", "value1");

restTemplate.delete(builder.buildAndExpand(42).toUri());
  • 自定义请求头的 DELETE 请求:

 需要设置自定义请求头,可以使用 HttpEntity<Void> 结合 exchange 方法。

HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer your_token_here");

HttpEntity<Void> entity = new HttpEntity<>(headers);

restTemplate.exchange("http://example.com/api/resource/42",
                      HttpMethod.DELETE,
                      entity,
                      Void.class);

6.发送 PUT 请求

  • 发送简单的 PUT 请求:
MyRequestObject obj = new MyRequestObject();
obj.setField1("new_value1");

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<MyRequestObject> request = new HttpEntity<>(obj, headers);

restTemplate.put("http://example.com/api/resource/42", request);
  • 处理响应:

得到服务器返回的数据,可以使用 exchange 方法,并指定响应类型。 

ResponseEntity<String> response = restTemplate.exchange(
    "http://example.com/api/resource/42",
    HttpMethod.PUT,
    request,
    String.class
);

System.out.println(response.getBody());
  • 带路径变量的 PUT 请求:
Map<String, String> params = Collections.singletonMap("id", "42");
restTemplate.put("http://example.com/api/resource/{id}", request, params);

7. 处理错误

RestTemplate 会抛出一些异常,如 ResourceAccessExceptionHttpClientErrorExceptionHttpServerErrorException。你可以捕获这些异常来处理不同的 HTTP 错误:

restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        // 自定义异常处理逻辑
    }
});

8. 使用 ResponseEntity

RestTemplate 还提供了 ResponseEntity 类型,它允许你访问完整的 HTTP 响应,包括状态码和响应头:

ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
if (response.getStatusCode().is2xxSuccessful()) {
    String body = response.getBody();
    // 处理响应体
}

注意事项

  • RestTemplate 是一个同步的客户端,如果你需要异步操作,可以考虑使用 WebClient
  • 从 Spring Framework 5 开始,RestTemplate 被标记为过时,推荐使用 WebClient,它提供了更现代的异步、非阻塞的 API。
  • 确保在使用 RestTemplate 时处理好异常和错误情况。

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

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

相关文章

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进&#xff0c;越来越多地区积极建设信息基础设施&#xff0c;以充沛算力支撑产业物联网的可持续发展&#xff0c;数据机房就是其中的典型代表。而且随着机房规模的扩大&#xff0c;对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…

unity 使用UI上的数字按钮,给text添加数字,并且显示光标,删除光标前数字,

今天有个需求&#xff0c;输入身份证&#xff0c;但是不用键盘&#xff0c;要点击按钮输入数字&#xff0c;并且可以控制光标&#xff0c; 1、数字按钮&#xff1a;点击后text添加数字内容 2、删除按钮&#xff1a;删除光标前的一个字符 3、左箭头&#xff1a;移动光标向左移动…

C++设计模式(单例模式)

一、介绍 1.动机 在软件系统中&#xff0c;经常有这样一些特殊的类&#xff0c;必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器&#xff0c;提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…

Could not locate device support files.

报错信息&#xff1a;Failure Reason: The device may be running a version of iOS (13.6.1 17G80) that is not supported by this version of Xcode.[missing string: 869a8e318f07f3e2f42e11d435502286094f76de] 问题&#xff1a;xcode15升级到xcode16之后&#xff0c;13.…

【Webgl_glslThreejs】制作流水效果/毛玻璃效果材质

效果预览 shadertory源码 source&#xff1a; https://www.shadertoy.com/view/lldyDs 材质代码 import { DoubleSide, ShaderChunk, ShaderMaterial, TextureLoader } from "three"; /** * * source https://www.shadertoy.com/view/lldyDs */export default fu…

海康VsionMaster学习笔记(学习工具+思路)

一、前言 VisionMaster算法平台集成机器视觉多种算法组件&#xff0c;适用多种应用场景&#xff0c;可快速组合算法&#xff0c;实现对工件或被测物的查找测量与缺陷检测等。VM算法平台依托海康威视在图像领域多年的技术积淀&#xff0c;自带强大的视觉分析工具库&#xff0c;可…

XML JSON

XML 与 JSON 结构 XML&#xff08;eXtensible Markup Language&#xff09; 1. 定义 XML 是一种标记语言&#xff0c;用于描述数据的结构和内容。主要用于数据存储与交换。 2. 特点 可扩展性&#xff1a;用户可以自定义标签。层次化结构&#xff1a;数据以树形结构组织&…

[VSCode] vscode下载安装及安装中文插件详解(附下载文件)

前言 vscode 链接&#xff1a;https://pan.quark.cn/s/3acbb8aed758 提取码&#xff1a;dSyt VSCode 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 …

wireshark基础

免责声明&#xff1a; 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;https://longyusec.com/ 泷羽sec B站地址&#xff1a;https:/…

李宏毅LLM探索(1)

1引入 1.1 提问&#xff1a;请列出你能做的事情&#xff0c;至少三十项&#xff0c;每一项都简单扼要:然后把你能做的事情制成文字云 文心一言生成&#xff1a; 以下是我能做的至少三十项事情&#xff0c;每一项都简单扼要地列出&#xff1a;回答问题 提供信息 生成文本 理解…

磁盘文件系统问题排查

1. ext4磁盘结构 块组&#xff1a;超级块&#xff1a;块位图&#xff1a;inode位图&#xff1a;inode表&#xff1a;空闲inode表&#xff1a;空闲块表&#xff1a;2. 块组结构 Group 0: (Blocks 0-32767) csum 0xfd42 [ITABLE_ZEROED]Primary superblock at 0, Group descript…

百度雪花算法id默认配置过期注意更新配置

百度雪花id项目地址&#xff1a;GitHub - baidu/uid-generator: UniqueID generator 默认配置根据redme看容易看迷糊&#xff0c;图和配置它压根就不是对应的 默认的配置如下 <!-- Specified bits & epoch as your demand. No specified the default value will be us…

(11)(2.2) BLHeli32 and BLHeli_S ESCs(二)

文章目录 前言 1 传递支持 前言 BLHeli 固件和配置应用程序的开发是为了允许配置 ESC 并提供额外功能。带有此固件的 ESC 允许配置定时、电机方向、LED、电机驱动频率等。在尝试使用 BLHeli 之前&#xff0c;请按照 DShot 设置说明进行操作(DShot setup instructions)。 1 传…

【初阶数据结构和算法】初识树与二叉树的概念以及堆和完全二叉树之间的关系

文章目录 一、树的概念与结构1.树的概念2.树的相关术语3.树的表示4.树形结构实际运用举例 二、二叉树的概念及特殊二叉树1.二叉树的概念2.特殊的二叉树满二叉树完全二叉树二叉树的性质(由满二叉树特点推导) 三、二叉树的存储结构1.二叉树的顺序结构2.二叉树的链式结构 四、堆和…

如何在Canvas中添加背景图片、图片元素和文字元素

Canvas是HTML5中一个强大的元素&#xff0c;它允许我们在网页上进行图形绘制。在本文中&#xff0c;我们将学习如何在Canvas中添加背景图片、图片元素以及文字元素。 创建Canvas元素 首先&#xff0c;我们需要在HTML文档中创建一个<canvas>元素。以下是创建一个500x500像…

单点登录深入详解之设计方案总结

基于cookie的单点登录解决方案 概述 用户登录之后 , 将认证信息存储至 Cookie &#xff0c;当再次访问本服务或者访问其他应用服务时&#xff0c;直接从 Cookie 中传递认证信息&#xff0c;进行鉴权处理。 问题 1. 如何保障Cookie内用户认证信息的安全性? 第一, Cookie…

深入探讨 Redis 持久化机制:原理、配置与优化策略

文章目录 一、引言二、Redis持久化概述三、RDB&#xff08;Redis DataBase&#xff09;持久化1、RDB概念与工作原理2、RDB的配置选项3、RDB优化配置项4、RDB的优势与劣势 三、AOF&#xff08;Append-Only File&#xff09;持久化1、AOF概念与工作原理2、AOF的三种写回策略3、Re…

Java图书管理系统(简易保姆级)

前面学习了这么多知识&#xff0c;为了巩固之前的知识&#xff0c;我们就要写一个图书管理系统来帮助大家复习&#xff0c;让大家的知识融会贯通~~~ 话不多说&#xff0c;直接开始今天的内容~ 首先呢&#xff0c;我们要有一个大体的思路&#xff1a; 实现效果思路有两种情况&a…

网络安全在现代企业中的重要作用

网络安全是这个数字时代最令人担忧的事情之一。对技术的依赖性越来越强&#xff0c;使其同时面临多种网络威胁。其声誉和法律后果的大幅下降可能归因于一次妥协。 这使得良好的网络安全成为所有企业的选择和必需品。本文介绍了网络安全的重要性、企业中常见的网络威胁以及公司…

Zero to JupyterHub with Kubernetes中篇 - Kubernetes 常规使用记录

前言&#xff1a;纯个人记录使用。 搭建 Zero to JupyterHub with Kubernetes 上篇 - Kubernetes 离线二进制部署。搭建 Zero to JupyterHub with Kubernetes 中篇 - Kubernetes 常规使用记录。搭建 Zero to JupyterHub with Kubernetes 下篇 - Jupyterhub on k8s。 参考&…