当前位置: 首页 > news >正文

RestTemplate超简单上手

目录

1.什么是RestTemplate?

2.RestTemplate的使用

2.1spring环境下

注意1:RestTemplate中发送请求execute()和exchange()方法的区别

execute()方式

exchange()方式

二者的区别

注意2:进阶配置——底层HTTP客户端

2.2非spring环境下


1.什么是RestTemplate?

RestTemplate是一款Spring框架中的HTTP客户端工具类库,它封装了大量的HTTP请求处理代码,使得我们可以方便地进行HTTP请求的发送与处理。RestTemplate支持多种HTTP请求方式,例如GET、POST、PUT、DELETE等,同时也支持参数的传递与响应结果的解析等功能,使得我们在进行RESTful风格的API开发时更加方便。

2.RestTemplate的使用

RestTemplate的使用分为俩种方式,一种是spring环境,一种是非spring环境

2.1spring环境下

添加pom依赖:

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

添加RestTemplate配置类:

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();return restTemplate;}
}

使用示例:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RequestCallback;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.web.client.RestTemplate;import java.util.Map;/*** RestTemplate Use Example Demo** @author JiuLi*/
@Controller
public class RestTemplateCtrl {@Autowiredprivate RestTemplate restTemplate;/*** exchange()形式** @param data* @return*/@RequestMapping(value = "/resttemplate/getNative", method = RequestMethod.GET)public String restTemplateNativeTest(Map data) {// 请求头HttpHeaders httpHeaders = new HttpHeaders();HttpEntity<Object> httpEntity = new HttpEntity<>(data, httpHeaders);String url = "";// 发送请求ResponseEntity entity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);// 获取请求回调JSONObject jsonObject = JSONObject.parseObject(JSON.toJSON(entity.getBody()).toString());// 打印请求返回信息return jsonObject.toJSONString();}/*** execute()形式** @param data* @return*/@RequestMapping(value = "/resttemplate/getreqAndrep", method = RequestMethod.GET)public String restTemplateTest(Map data) {// 请求头HttpHeaders httpHeaders = new HttpHeaders();HttpEntity<Object> httpEntity = new HttpEntity<>(httpHeaders);// 请求提取器RequestCallback requestCallback = restTemplate.httpEntityCallback(httpEntity, Map.class);// 响应提取器ResponseExtractor<ResponseEntity<Map>> responseExtractor = restTemplate.responseEntityExtractor(Map.class);String url = "";// 发送请求ResponseEntity entity = restTemplate.execute(url, HttpMethod.GET, requestCallback, responseExtractor, data);// 获取请求回调JSONObject jsonObject = JSONObject.parseObject(JSON.toJSON(entity.getBody()).toString());// 打印请求返回信息return jsonObject.toJSONString();}}

注意1:RestTemplate中发送请求execute()和exchange()方法的区别

在使用RestTemplate发送HTTP请求时,我们通常会使用execute()或exchange()方法来发送请求。这两个方法的作用类似,但是有一些区别,在本篇博客中我们将介绍execute()和exchange()方法的区别。

execute()方式

execute()方法是RestTemplate中最基本的请求方法,它的定义如下:

public <T> T execute(String url, HttpMethod method, RequestCallback requestCallback,ResponseExtractor<T> responseExtractor) throws RestClientException {// ...
}

传入四个参数:请求URL、HTTP请求方法、RequestCallback对象和ResponseExtractor对象。其中,RequestCallback代表着请求体,可以通过实现该接口来设置请求体的内容;ResponseExtractor代表着响应结果的处理器,可以通过实现该接口来对响应结果进行解析。

execute()方法可以返回任意类型的响应结果,包括自定义类型、String类型等由ResponseExtractor对象决定。

exchange()方式

exchange()方法的定义如下:

public <T> ResponseEntity<T> exchange(String url, HttpMethod method, HttpEntity<?> requestEntity,Class<T> responseType, Object... uriVariables) throws RestClientException {// ...
}

与execute()方法不同,exchange()方法返回的是ResponseEntity<T>类型的响应结果对象。ResponseEntity包含了响应状态码,响应头以及响应体等信息。

exchange()方法的请求体为HttpEntity对象,而非RequestCallback对象。HttpEntity用于封装请求体和请求头信息。

除此之外,在exchange()方法中还可以传入uriVariables参数。这个参数用于替换URL中的变量,例如:

String url = "http://localhost:8080/{id}";
ResponseEntity<User> response = restTemplate.exchange(url, HttpMethod.GET, null, User.class, 1);

在上述代码中,我们通过exchange()方法使用占位符{id}替换URL中的变量,并将变量的值设置为1。

二者的区别

execute()方法更加灵活,可以处理任意类型的响应结果,同时请求体也更加自由。而exchange()方法则更加直观,能够提供完整的响应对象,方便进行状态码和响应头的解析。

当我们只需要简单地获取响应结果时,可以使用execute()方法;而在需要对响应状态码、响应头等信息进行处理时,建议使用exchange()方法。

注意2:进阶配置——底层HTTP客户端

如上方式添加的RestTemplate配置类默认使用的是JDK自带的HttpURLConnection客户端作为底层的HTTP客户端实现的,实际上使用默认的HttpURLConnection客户端已经足够我们进行一系列的Http请求操作了,但是具体受限于某些需求或项目要求,HttpURLConnection客户端不满足一些我们的需求,那么我们可以通过配置替换的方式,指定使用HttpClient客户端替换默认的客户端;HttpClient是一个功能强大、高度可定制、性能优越的HTTP客户端工具类库,它可以满足更多复杂的HTTP请求需求。

使用HttpClient客户端好处:

1.支持连接池:使用HttpClient作为底层客户端可以支持连接池机制,减少每次请求建立连接和关闭连接的开销,提高请求效率。而默认的HttpURLConnection会在每次请求时重新建立连接,效率较低。

2.支持自定义拦截器:使用HttpClient可以通过自定义拦截器来实现一些特殊的功能,例如HTTP认证、请求重试等。而HttpURLConnection则很难通过自定义拦截器来实现这些功能。

3.支持更多协议:HttpClient支持HTTP协议以外的协议,例如HTTPS、FTP等。

缺点:

1.需要额外配置:如果使用HttpClient作为底层客户端,需要引入相应的依赖,并进行相应的配置,增加了使用成本。

2.可能会有线程安全的问题:默认情况下,HttpClient是不线程安全的,如果在多线程环境下并发使用同一个HttpClient实例,可能会出现线程安全问题。为了避免这个问题,我们可以采用各种线程安全的HttpClient实现方式,例如使用PoolingHttpClientConnectionManager来管理连接池。

使用Httpclient,在RestTemplateConfig配置即可:

首先需要添加pom依赖:

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>${httpclient.version}</version>
</dependency>

方式一:

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();return restTemplate;}/*** 使用HttpClient作为底层客户端* @return*/private ClientHttpRequestFactory getClientHttpRequestFactory() {int timeout = 5000;RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();return new HttpComponentsClientHttpRequestFactory(client);}}

方式二:

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(new PoolingHttpClientConnectionManager()).build();HttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory();requestFactory.setHttpClient(httpClient);RestTemplate restTemplate = new RestTemplate();return restTemplate;}}

当然还有其他的Http客户端,例如OKHttpClient,OKHttpClient优于Httpclient优于默认的HttpURLConnection;具体如何选择看开发需求,以下是使用OKHttpClient的配置:

import okhttp3.OkHttpClient;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;import java.util.concurrent.TimeUnit;@Configuration
public class RestTemplateConfig {/*** 没有实例化RestTemplate时,初始化RestTemplate* @return*/@ConditionalOnMissingBean(RestTemplate.class)@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();return restTemplate;}/*** 使用OkHttpClient作为底层客户端* @return*/private ClientHttpRequestFactory getClientHttpRequestFactory(){OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).writeTimeout(5, TimeUnit.SECONDS).readTimeout(5, TimeUnit.SECONDS).build();return new OkHttp3ClientHttpRequestFactory(okHttpClient);}}

2.2非spring环境下

导入依赖:

如果当前项目不是Spring项目,加入spring-web包,即可引入RestTemplate

<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.6.RELEASE</version>
</dependency>

使用new的形式获取到RestTemplate的实例,以发送get请求为例进行测试:

public void simpleTest() {RestTemplate restTemplate = new RestTemplate();String url = "";String str = restTemplate.getForObject(url, String.class);System.out.println(str);
}

所以,当在非spring环境下需要使用resttemplate时,只需要使用New获取到restTmeplate的实例,然后再进行之后所需要的收发Http请求的操作即可

相关文章:

RestTemplate超简单上手

目录 1.什么是RestTemplate? 2.RestTemplate的使用 2.1spring环境下 注意1&#xff1a;RestTemplate中发送请求execute()和exchange()方法的区别 execute()方式 exchange()方式 二者的区别 注意2&#xff1a;进阶配置——底层HTTP客户端 2.2非spring环境下 1.什么是R…...

监控系统设计原则及实现目标

1.1.1.1 1 &#xff0e;完善的设计理念&#xff1a; 包括符合国际发展潮流的特性化设计&#xff0c;完整的安防监控及围墙周界报警系统 的布线、设备安装、调试、测试、验收的“交钥匙”工程管理制度&#xff0c;以及符合标 准的质量控制体系。 1.1.1.2 设计原则&#xf…...

VulnHub项目:MONEYHEIST: CATCH US IF YOU CAN

靶机名称&#xff1a; MONEYHEIST: CATCH US IF YOU CAN 地址&#xff1a;MoneyHeist: Catch Us If You Can ~ VulnHub 这个系列是一部剧改编&#xff0c;还是挺好看的&#xff0c;大家有兴趣可以去看看&#xff01; 废话不多说&#xff0c;直接上图开始&#xff01; 渗透…...

对象存储OSS简介,一分钟了解对象存储OSS

对象存储&#xff08;Object Storage&#xff09;是一种新兴的数据存储方式&#xff0c;与传统的文件系统和块存储不同&#xff0c;对象存储以对象为基本单位进行数据管理和存储。在对象存储中&#xff0c;每个对象都有唯一的标识符&#xff0c;并包含了数据本身以及与之相关的…...

SpringCloud_微服务基础day2(Eureka简介与依赖导入,服务注册与发现)

p6:Eureka简介与依赖导入 前面我们了解了如何对单体应用进行拆分&#xff0c;并且也学习了如何进行服务之间的相互调用&#xff0c;但是存在一个问题&#xff0c;就是虽然服务拆分完成&#xff0c;但是没有一个比较合理的管理机制&#xff0c;如果单纯只是这样编写&#xff0c;…...

#tmux# #终端# 常用工具tmux

tmux tmux是一个终端复用工具&#xff0c;允许用户在一个终端会话中同时管理多个终端窗口&#xff0c;提高了终端使用效率&#xff0c;尤其在服务器上进行远程管理时更加实用。在tmux中&#xff0c;可以创建多个终端窗口和窗格&#xff0c;并在这些窗口和窗格之间自由切换&…...

后端服务架构高性能设计之道

“N 高 N 可”&#xff0c;高性能、高并发、高可用、高可靠、可扩展、可维护、可用性等是后台开发耳熟能详的词了&#xff0c;它们中有些词在大部分情况下表达相近意思。本序列文章旨在探讨和总结后台架构设计中常用的技术和方法&#xff0c;并归纳成一套方法论。 前言 本文主…...

Python中的Time和DateTime

Python在处理与时间相关的操作时有两个重要模块&#xff1a;time和datetime。在本文中&#xff0c;我们介绍这两个模块并为每个场景提供带有代码和输出的说明性示例。 time模块主要用于处理时间相关的操作&#xff0c;例如获取当前时间、时间的计算和格式化等。它提供了一些函数…...

UNIX网络编程卷一 学习笔记 第十九章 密钥管理套接字

随着IP安全体系结构&#xff08;IPsec&#xff09;的引入&#xff0c;密钥加密和认证密钥的管理越来越需要一套标准机制。RFC 2367介绍了一个通用密钥管理API&#xff0c;可用于IPsec和其他网络安全服务&#xff0c;该API创建了一个新协议族&#xff0c;即PF_KEY域&#xff0c;…...

excel如何实现识别文本在对应单元格填上数据?

要实现 Excel 识别文本在对应单元格填上数据&#xff0c;有以下两种方法&#xff1a; 方法一&#xff1a;使用 VLOOKUP 函数 1. 在 Excel 工作表中&#xff0c;输入一个表格&#xff0c;列名为对应的文本&#xff0c;行名为不同条目。 2. 准备输入数据&#xff0c;在一个新的…...

Groovy 基本语法

一、简介 类型转换:当需要时,类型之间会自动发生类型转换: 字符串&#xff08;String&#xff09;、基本类型(如int) 和类型的包装类(如Integer) 类说明&#xff1a;如果在一个groovy 文件中没有任何类定义&#xff0c;它将被当做script 来处理&#xff0c;也就意味着这个文件将…...

系统学习IT技术的方法与实践

系统学习IT技术的方法与实践 作为一名技术人员&#xff0c;在学习新的IT技术时&#xff0c;采取系统性的学习方法是至关重要的。这样可以帮助我们更好地理解和掌握技术&#xff0c;并提高学习效率。下面我将分享一些我个人在系统学习IT技术方面的方法和实践。 1. 设定明确的学…...

聊聊TCP协议的粘包、拆包以及http是如何解决的?

目录 一、粘包与拆包是什么&#xff1f; 二、粘包与拆包为什么发生&#xff1f; 三、遇到粘包、拆包怎么办&#xff1f; 解决方案1&#xff1a;固定数据大小 解决方案2&#xff1a;自定义请求协议 解决方案3&#xff1a;特殊字符结尾 四、HTTP如何解决粘包问题的&#xf…...

一百二十、Kettle——用kettle把Hive数据同步到ClickHouse

一、目标 用kettle把hive数据同步到clickhouse&#xff0c;简单运行、直接全量导入数据 工具版本&#xff1a;kettle&#xff1a;8.2 Hive:3.1.2 ClickHouse21.9.5.16 二、前提 &#xff08;一&#xff09;kettle连上hive &#xff08;二&#xff09;kettle连上cli…...

PyTorch 提示和技巧:从张量到神经网络

张量和梯度 我们将深入探讨使用 PyTorch 构建自己的神经网络必须了解的 2 个基本概念&#xff1a;张量和梯度。 张量 张量是 PyTorch 中的中央数据单元。它们是类似于数组的数据结构&#xff0c;在功能和属性方面与 Numpy 数组非常相似。它们之间最重要的区别是 PyTorch 张量…...

第五期:字符串的一些有意思的操作

文章目录 1. 替换空格2. 字符串的左旋转3. 答案代码3.1 替换空格3.2 字符串的左旋转 PS&#xff1a;每道题解题方法不唯一&#xff0c;欢迎讨论&#xff01;每道题后都有解析帮助你分析做题&#xff0c;答案在最下面&#xff0c;关注博主每天持续更新。 1. 替换空格 题目描述 请…...

使用Anaconda3结合vscode来实现django项目的建立(绝好的介绍)20230608

问题:如何使用Anaconda3结合vscode来实现django项目的建立&#xff1f; 回答: 知识背景 Anaconda3的安装包默认会安装最新版本的Python解释器。如果您想在安装时指定Python解释器的版本&#xff0c;您需要下载对应版本的Anaconda3。例如&#xff0c;如果您想使用Python 3.7&…...

【软件测试】软件测试的基本概念和开发模型

1. 前言 在进行软件测试的学习之前,我们要了解软件测试一些基本概念. 这些基本概念将帮助我们更加明确工作的目标以及软件测试到底要做什么. 2. 软件测试的基本概念 软件测试的基本概念有3个,分别是需求,测试用例和BUG. 2.1 需求 这里的需求还可以分为 用户需求和软件需求,用户…...

接口测试 —— 接口测试定义

1、接口测试概念 &#xff08;重点&#xff09; 接口测试是测试系统组件间接口的一种测试&#xff0c;它界于单元测试与系统测试中间。 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。 测试的重点是要检查数据的交换&#xff0c;传递和控制管理过…...

2015 年一月联考逻辑真题

2015 年一月联考逻辑真题 真题&#xff08;2015-26&#xff09; 26.晴朗的夜晚我们可以看到满天星斗&#xff0c;其中有些是自身发光的恒星&#xff0c;有些是自身不发光但可以反射附近恒星光的行星。恒星尽管遥远&#xff0c;但是有些可以被现有的光学望远镜“看到”。和恒星不…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...