重学SpringBoot3-RestTemplate配置与使用详解

重学SpringBoot3-RestTemplate配置与使用详解
更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-RestTemplate配置与使用详解

1. 简介

RestTemplate 是 Spring 框架提供的一个用于发送 HTTP 请求的同步客户端工具类。在 SpringBoot 3.x 版本中,我们依然可以使用 RestTemplate 来进行 REST API 的调用。本文将详细介绍如何在 SpringBoot 3 项目中配置和使用 RestTemplate。

2. 环境要求

  • JDK 17+
  • Spring Boot 3.x
  • Maven/Gradle

3. 基础配置

3.1 添加依赖

首先在pom.xml中添加相关依赖:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

3.2 RestTemplate配置类

创建一个配置类来注册RestTemplate Bean:

packagecom.coderjia.springboot304web.config;importorg.springframework.boot.web.client.RestTemplateBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;importjava.time.Duration;/** * @author CoderJia * @create 2024/12/1 下午 04:24 * @Description **/@ConfigurationpublicclassRestTemplateConfig{@BeanpublicRestTemplaterestTemplate(RestTemplateBuilder builder){return builder .setConnectTimeout(Duration.ofSeconds(5)).setReadTimeout(Duration.ofSeconds(5)).build();}}

4. 高级配置

4.1 自定义连接池配置

为了提高性能,我们可以使用 Apache HttpClient 连接池:

<dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.2.1</version></dependency>

配置连接池:

@ConfigurationpublicclassRestTemplateConfig{@BeanpublicRestTemplaterestTemplate(){PoolingHttpClientConnectionManager connectionManager =newPoolingHttpClientConnectionManager(); connectionManager.setMaxTotal(200);// 最大连接数为 200 connectionManager.setDefaultMaxPerRoute(20);// 每个路由的最大连接数为 20CloseableHttpClient httpClient =HttpClients.custom()// 建 HTTP 客户端.setConnectionManager(connectionManager).build();// 创建请求工HttpComponentsClientHttpRequestFactory factory =newHttpComponentsClientHttpRequestFactory(httpClient);// 返回 RestTemplatereturnnewRestTemplate(factory);}}

4.2 错误处理配置

自定义错误处理器:

publicclassCustomResponseErrorHandlerimplementsResponseErrorHandler{@OverridepublicbooleanhasError(ClientHttpResponse response)throwsIOException{return response.getStatusCode().is4xxClientError()|| response.getStatusCode().is5xxServerError();}@OverridepublicvoidhandleError(ClientHttpResponse response)throwsIOException{if(response.getStatusCode().is5xxServerError()){thrownewRuntimeException("服务器错误: "+ response.getStatusCode());}elseif(response.getStatusCode().is4xxClientError()){thrownewRuntimeException("客户端错误: "+ response.getStatusCode());}}}

将错误处理器添加到 RestTemplate:

@BeanpublicRestTemplaterestTemplate(RestTemplateBuilder builder){return builder .errorHandler(newCustomResponseErrorHandler()).build();}
错误处理

5. 使用示例

5.1 RestTemplate方法列表

方法组描述
getForObject通过GET请求获取资源的表示形式
getForEntity通过GET请求获取ResponseEntity(包含状态码、请求头和响应体)
headForHeaders通过HEAD请求获取资源的所有请求头信息
postForLocation通过POST请求创建新资源,并返回响应中的Location头信息
postForObject通过POST请求创建新资源,并返回响应的表示形式
postForEntity通过POST请求创建新资源,并返回响应的表示形式(包含完整的响应信息)
put通过PUT请求创建或更新资源
patchForObject通过PATCH请求更新资源并返回响应的表示形式(注意:JDK的HttpURLConnection不支持PATCH,但Apache HttpComponents等支持)
delete通过DELETE请求删除指定URI的资源
optionsForAllow通过ALLOW请求获取资源支持的HTTP方法
exchange更通用(且更灵活)的方法版本,提供额外的灵活性。接受RequestEntity作为输入(包括HTTP方法、URL、请求头和请求体),返回ResponseEntity。这些方法允许使用ParameterizedTypeReference代替Class来指定带有泛型的响应类型
execute执行请求的最通用方式,通过回调接口可以完全控制请求准备和响应提取过程

这个表格展示了 RestTemplate 提供的所有主要方法,每个方法都有其特定的用途和场景。从简单的GET请求到复杂的自定义请求处理,RestTemplate 都提供了相应的支持。

5.2 基本使用

@Slf4j@RestControllerpublicclassRestTemplateController{@ResourceprivateRestTemplate restTemplate;// get@GetMapping("/get")publicJSONObjectget(@RequestParam("q1")String q1,@RequestParam("q2")String q2){ log.info("get");String url ="https://echo.apifox.com/get";return restTemplate.getForObject(url,JSONObject.class, q1, q2);}// post@GetMapping("/post")publicJSONObjectpost(@RequestParam("q1")String q1,@RequestParam("q2")String q2){ log.info("post");String url ="https://echo.apifox.com/post";JSONObject body =newJSONObject(); body.put("q1", q1); body.put("q2", q2);return restTemplate.postForObject(url, body,JSONObject.class);}// delete@GetMapping("/delete")publicStringdelete(@RequestParam("id")Long id){ log.info("delete");String url ="https://echo.apifox.com/delete"; restTemplate.delete(url, id);return"Data deleted successfully!";}// put@GetMapping("/put")publicStringput(@RequestParam("id")Long id,@RequestParam("name")String name){ log.info("put");String url ="https://echo.apifox.com/put";JSONObject body =newJSONObject(); body.put("id", id); body.put("name", name); restTemplate.put(url, body, id);return"Data updated successfully!";}}

请求响应

get请求
post请求
delete请求
put请求

5.3 使用请求头

publicUsergetUserWithHeaders(Long id){String url ="http://api.example.com/users/{id}";HttpHeaders headers =newHttpHeaders(); headers.set("Authorization","Bearer token123"); headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<String> entity =newHttpEntity<>(headers);ResponseEntity<User> response = restTemplate.exchange( url,HttpMethod.GET, entity,User.class, id );return response.getBody();}
使用请求头

5.4 处理复杂响应

@GetMapping("/getAnyThing")publicJSONObjectgetList(@RequestParam("q1")String q1,@RequestParam("q2")String q2){ log.info("getAnyThing");String url ="https://echo.apifox.com/post";JSONObject jsonObject =newJSONObject(); jsonObject.put("q1", q1); jsonObject.put("q2", q2);HttpEntity<JSONObject> entity =newHttpEntity<>(jsonObject);// 定义了一个泛型类型的引用 typeRef,用于指定 restTemplate.exchange 方法返回的响应体类型为 JSONObject。ParameterizedTypeReference<JSONObject> typeRef =newParameterizedTypeReference<>(){};ResponseEntity<JSONObject> response = restTemplate.exchange( url,HttpMethod.POST, entity, typeRef );return response.getBody();}
处理复杂响应

5.5 打印日志拦截器

packagecom.coderjia.springboot304web.config;importlombok.extern.slf4j.Slf4j;importorg.springframework.http.HttpRequest;importorg.springframework.http.client.ClientHttpRequestExecution;importorg.springframework.http.client.ClientHttpRequestInterceptor;importorg.springframework.http.client.ClientHttpResponse;importjava.io.IOException;/** * @author CoderJia * @create 2024/12/1 下午 05:02 * @Description **/@Slf4jpublicclassLoggingInterceptorimplementsClientHttpRequestInterceptor{@OverridepublicClientHttpResponseintercept(HttpRequest request,byte[] body,ClientHttpRequestExecution execution)throwsIOException{ log.info("Request: "+ request.getMethod()+" "+ request.getURI());ClientHttpResponse response = execution.execute(request, body); log.info("Response: "+ response.getStatusCode());return response;}}

RestTemplate设置拦截器:

List<ClientHttpRequestInterceptor> interceptors =newArrayList<>(); interceptors.add(newLoggingInterceptor());RestTemplate build = builder .errorHandler(newCustomResponseErrorHandler()).build(); build.setInterceptors(interceptors);

6. 最佳实践

  1. 超时设置:始终设置合适的连接超时和读取超时时间。
  2. 错误处理:实现自定义的错误处理器来处理异常情况。
  3. 连接池:在高并发场景下使用连接池来提升性能。
  4. 重试机制:对于不稳定的服务,考虑添加重试机制。
  5. 日志记录:添加适当的日志记录来跟踪请求和响应。

7. 注意事项

  1. RestTemplate 在 Spring 5.0 之后被标记为维护模式,建议在新项目中考虑使用 WebClient。
  2. 在生产环境中,要注意设置合理的超时时间和连接池参数。
  3. 处理响应时要注意检查响应状态和错误处理。
  4. 使用 HTTPS 时需要适当配置SSL证书。

8. 总结

本文详细介绍了在 SpringBoot 3.x 中如何配置和使用 RestTemplate,包括基本配置、高级配置以及各种使用场景。虽然 RestTemplate 目前处于维护模式,但它仍然是一个稳定且易用的HTTP客户端工具。对于新项目,也可以考虑使用响应式的WebClient作为替代方案。

参考资料

Read more

Android WebRTC视频通话开发实战:AI辅助优化与避坑指南

快速体验 在开始今天关于 Android WebRTC视频通话开发实战:AI辅助优化与避坑指南 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 Android WebRTC视频通话开发实战:AI辅助优化与避坑指南 在移动应用开发中,实时视频通话功能已经成为社交、教育和远程协作类App的标配。WebRTC作为开源项目,为开发者提供了强大的实时通信能力,但在Android平台上实现高质量的视频通话仍然面临诸多挑战。本文将分享如何利用AI技术优化WebRTC视频通话体

By Ne0inhk

Dify Web 前端二次开发(隐藏探索功能 + 替换 Logo)

核心修改内容 1. 隐藏导航栏「探索」功能(图标 + 文字按钮); 2. 将默认 Dify Logo 替换为自定义 FDAI Logo(PNG 格式)。 (一)隐藏「探索」功能完整过程 1. 定位目标组件 探索功能对应的组件文件路径:web/app/components/header/explore-nav/index.tsx(组件名:ExploreNav),该组件被嵌套在 Header 组件中渲染,无需修改布局文件 app/(commonlayout)/layout.tsx。 2. 首次尝试:仅删除图标(未彻底隐藏) * 操作:删除组件内图标渲染代码 { activated ? <RiPlanetFill />

By Ne0inhk

前端怎么打断点,debugger使用教程

流程1:打上断点 方式一:编辑器内 在一行代码的前面或者后面写上debugger 运行到这的时候就会停止啦 方式二:浏览器控制台内 直接在控制台的source(中文版为源代码/来源)目录下点击左边的行数即可 然后刷新一下  流程2:遇上断点 遇到断点后,程序会停止运行,此时注意,控制器里打断点的那行代码并没有被执行, 第一个按钮是一直执行到下一个断点的意思,直到运行完毕 第二个按钮是进行下一步,也就是执行下一个逻辑,又或者说,【按逻辑(比如会遇到 if 那些)去执行下一行代码】。 箭头:停止断点调试 眼睛:不跳入函数中去,继续执行下一行代码(F10) 向下的箭头:跳入函数中去(F11) 向上的箭头:从执行的函数中跳出 带斜杠的图标:禁用所有的断点,不做任何调试   流程3:查看变量(英文版为scope) 可以查看到不同作用域下的变量的动态变化 ,如下图所示,展示了代码块范围内的所有变量: 提示

By Ne0inhk
AI 生成的 UI 太丑?3 步让你的前端秒变高级感

AI 生成的 UI 太丑?3 步让你的前端秒变高级感

🚀 AI 生成的 UI 太丑?3 步让你的前端秒变高级感 你是不是也遇到过这种情况:满心期待地用 AI 生成一个前端页面,结果得到的是一个土到掉渣的蓝紫色界面,丑到自己都看不下去?🤦‍♂️ 别担心,你不是一个人!这是目前 90% 开发者使用 AI 写前端时都会遇到的痛点。 好消息是,经过一番研究和实践,我们发现了一些有效的方法!通过几个简单的技巧,不需要手写任何 CSS,就能让 AI 帮你生成媲美专业设计师的 UI 界面。 今天就手把手教你 3 步搞定,让 AI 彻底告别 “AI 味”! 🧪 实验准备 工具准备 想要跟着实验,你需要准备: 1. Claude Code (2.0.55) 底层模型是 Minimax-M2

By Ne0inhk