Springboot 开发之 RestTemplate 简介

news/2024/11/14 11:51:56/

一、什么是RestTemplate

RestTemplate 是Spring框架提供的一个用于应用中调用REST服务的类。它简化了与HTTP服务的通信,统一了RESTFul的标准,并封装了HTTP连接,我们只需要传入URL及其返回值类型即可。RestTemplate的设计原则与许多其他Spring的模板类(如JdbcTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。

二、RestTemplate 的常用方法

RestTemplate提供了多种方法来进行HTTP请求,主要方法包括:

1. GET请求:

  • getForObject(String url, Class responseType, Object… uriVariables): 直接返回响应体中的数据。
  • getForEntity(String url, Class responseType, Object… uriVariables): 返回一个ResponseEntity对象,其中包含了响应的详细信息,如状态码、响应头等。

2. POST请求:

  • postForObject(String url, Object request, Class responseType): 发送POST请求,并返回响应体中的数据。
  • postForEntity(String url, Object request, Class responseType): 发送POST请求,并返回一个ResponseEntity对象。

3. PUT请求:

  • put(String url, Object request): 发送PUT请求。
  • putForObject(String url, Object request, Class responseType): 发送PUT请求,并返回响应体中的数据。

4. DELETE请求:

  • delete(String url): 发送DELETE请求。
    其他方法:
  • exchange(RequestEntity<?> request, Class responseType): 这是一个通用的方法,可以根据RequestEntity对象发送请求,并返回ResponseEntity对象。
    在这里插入图片描述

三、RestTemplate基本使用

1. pom 文件依赖

Spring Boot的 web starter 已经内置了RestTemplate的Bean,我们主需要将它引入到我们的Spring Context中,再进行下简单的配置就可以直接使用了。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version>
</dependency>

2. 配置 RestTemplate

(1)默认配置:

RestTemplate默认使用 SimpleClientHttpRequestFactory,内部调用JDK的HttpURLConnection进行HTTP请求,默认的超时时间为-1(即无限期等待)。

java">@Configuration  
public class RestClientConfig {  @Bean  public RestTemplate restTemplate(RestTemplateBuilder builder) {  return builder.build();  }  // 或者自定义请求工厂  @Bean  public RestTemplate restTemplate() {  SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();  factory.setReadTimeout(5000); // 设置读取超时时间  factory.setConnectTimeout(5000); // 设置连接超时时间  return new RestTemplate(factory);  }  
}

(2)自定义配置:

可以通过设置ClientHttpRequestFactory来自定义RestTemplate的配置,如使用HttpComponentsClientHttpRequestFactory(基于Apache HttpClient)或OkHttp3ClientHttpRequestFactory(基于OkHttp)等。
可以配置连接池、超时时间、请求和响应的编解码等。

java">@Configuration
public class RestTemplateConfig {@Bean public HttpClientConnectionManager poolingHttpClientConnectionManager() {PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();// 设置最大连接数poolingHttpClientConnectionManager.setMaxTotal(500);// 设置每个路由的最大连接数poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);return poolingHttpClientConnectionManager;}@Beanpublic HttpClient httpClient(HttpClientConnectionManager poolingHttpClientConnectionManager) {HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();// 设置 HttpClient 的连接管理器httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);return httpClientBuilder.build();}@Beanpublic ClientHttpRequestFactory clientHttpRequestFactory(HttpClient httpClient) {HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();// 设置 HttpClientclientHttpRequestFactory.setHttpClient(httpClient);// 设置连接超时时间(毫秒)clientHttpRequestFactory.setConnectTimeout(5 * 1000);// 设置读取超时时间(毫秒)clientHttpRequestFactory.setReadTimeout(10 * 1000);// 设置从连接池获取连接的超时时间(毫秒)clientHttpRequestFactory.setConnectionRequestTimeout(10 * 1000);return clientHttpRequestFactory;}@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory clientHttpRequestFactory) {RestTemplate restTemplate = new RestTemplate();// 设置请求工厂restTemplate.setRequestFactory(clientHttpRequestFactory);return restTemplate;}}

四、服务端代码实战

1. 服务端接口类

java">@RestController
public class RestControllerDemo {/*** 普通Get** @param name* @return*/@GetMapping("/get")private String getMethod(@RequestParam("name") String name) {System.out.println("getMethod : name=" + name);return name;}/*** Restful Get** @param name* @return*/@GetMapping("/getName/{name}")private String getRestName(@PathVariable("name") String name) {System.out.println("getRestName : name=" + name);return name;}/*** post** @param name* @return*/@PostMapping("/post")private String postMethod(@RequestParam("name") String name) {System.out.println("postMethod : name=" + name);return name;}/*** post json** @param stu* @return*/@PostMapping("/postBody")public String postBodyMethod(@RequestBody String stu) {Student student = JSONObject.parseObject(stu, Student.class);System.out.println("postBodyMethod : student=" + student);return student.toString();}
}

2. 测试类

java">@SpringBootTest
class DemoApplicationTests {// 引入 restTemplate@Resourceprivate RestTemplate restTemplate;@Testvoid getTest() {String str = restTemplate.getForObject("http://localhost:8888/get?name=zs", String.class);System.out.println(str);}@Testvoid getRestTest() {String name = "ls";String str = restTemplate.getForObject("http://localhost:8888/getName/" + name, String.class);System.out.println(str);}@Testvoid postTest() {LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();map.set("name", "zs");String str = restTemplate.postForObject("http://localhost:8888/post", map, String.class);System.out.println(str);}@Testvoid postBodyTest() {HttpHeaders headers = new HttpHeaders();MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");headers.setContentType(type);headers.add("Accept", MediaType.APPLICATION_JSON.toString());HashMap<String, Object> map = new HashMap<>();map.put("name", "zs");map.put("age", 23);String stu = JSON.toJSONString(map);HttpEntity<String> formEntity = new HttpEntity<String>(stu, headers);String str = restTemplate.postForObject("http://localhost:8888/postBody", formEntity, String.class);System.out.println(str);}}

3. exchange 使用示例

通过 HttpHeaders 和 UriComponentsBuilder 可以方便地添加自定义请求头和构建带参数的 URL。

java">UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)  .queryParam("param1", "value1")  .queryParam("param2", "value2");  String finalUrl = builder.toUriString();  
HttpHeaders headers = new HttpHeaders();  
headers.add("Custom-Header", "HeaderValue");  
HttpEntity<String> request = new HttpEntity<>(null, headers);  ResponseEntity<String> response = restTemplate.exchange(  finalUrl,  HttpMethod.GET,  request,  String.class  
);

http://www.ppmy.cn/news/1503490.html

相关文章

释放群众的创造力:打赢网络犯罪战争

关注公众号网络研究观获取更多内容。 企业业非但没有享受到技术带来的好处&#xff0c;反而承受着高昂的成本。 事情不应该是这样的。 企业投资 IT 是因为相信它可以改变他们与客户的关系、供应链和业务敏捷性。在过去 12 个月中&#xff0c;我们还看到人们对 AI 如何增强…

Cesium 雷达探测效果

Cesium 雷达探测效果 原理&#xff1a;后续补充 效果图&#xff1a;

操作系统-硬件结构学习心得

1. 程序执行基本过程 那CPU执行程序的过程如下: ●第一步&#xff0c;CPU读取[程序计数器」的值&#xff0c;这个值是指令的内存地址&#xff0c;然后CPU的「控制单元操作 「地址总线」指定需要访问的内存地址&#xff0c;接着通知内存设备准备数据&#xff0c;数据准备好后通…

【摸鱼笔记】subprocess,用子进程访问外部命令

subprocess是一个非常强大的模块&#xff0c;它能通过启动新进程的方式执行外部命令、访问系统Shell、管道等。 同时也能捕获这些新进程的输出和错误信息&#xff1b; subprocess模块是Python的标准库中的一部分&#xff0c;支持 Python 3.5 及 3.5 以上版本&#xff1b; 3.…

JavaScript/.Net/.Java三端对称加AES算法加解密

文章目录 前言一、JavaScript AES二、.Net AES三、Java AES总结 前言 AES&#xff08;Advanced Encryption Standard&#xff09;&#xff0c;即高级加密标准&#xff0c;是一种广泛应用的对称密钥加密算法&#xff0c;由美国国家标准与技术研究院&#xff08;NIST&#xff09;…

node环境安装electron

文章目录 前言 一、安装node 二、使用步骤 1.配置npm环境 2.安装electron 总结 前言 Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台的桌面应用程序。它基于 Node.js 和 Chromium&#xff0c;被 Atom 编辑器和许多其他应用程序使用。 Electron 兼容 Mac、Win…

【Rust光年纪】完整解读:六大Rust HTTP客户端库全面对比

Rust语言中的HTTP客户端库大比拼&#xff1a;全面对比与分析 前言 随着Rust语言在系统编程领域的不断发展&#xff0c;对于HTTP客户端库的需求也日益增长。本文将介绍几个用于Rust语言的HTTP客户端库&#xff0c;分别从简介、安装与配置以及API概览等方面进行详细对比和总结。…

Zookeeper源码剖析-启动类

文章目录 从启动脚本开始分析ZooKeeper启动脚本 `zkServer.sh` 分析1. 脚本位置2. 脚本结构3. 主要部分3.1 检测环境变量3.2 加载配置文件3.3 设置环境变量3.4 日志配置3.5 启动和停止命令3.6 启动ZooKeeper3.7 停止ZooKeeper4. 其他功能5. 调用方式总结ZooKeeper的 QuorumPeer…