[Java Framework] [Spring] Spring中RestTemplate中几种常见的请求方式

简介: > - RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。>- RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。>- 考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时HTTP协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS例如,RestTemplate类具有hea

🍀简介

  • RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。
  • RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。
  • 考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时HTTP协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS例如,RestTemplate类具有headForHeaders()、getForObject()、putForObject(),put()和delete()等方法。
  • RestTemplate 可以看到有很多方法,我们可以提取出主要的几种方法是:

GET / POST / PUT / DELETE / HEAD / OPTIONS / EXCHANGE / EXECUTE

🍀 方法 / 步骤

📌 实例化RestTemplate

因为RestTemplate是Spirng框架提供的所以只要是一个Springboot项目就不用考虑导包的问题,这些都是提供好的。
​ 但是Spring并没有将其加入SpringBean容器中,需要我们手动加入,因为我们首先创建一个Springboot配置类,再在配置类中将我们的RestTemlate注册到Bean容器中

方法一:

​ 使用Springboot提供的RestTemplateBuilder构造类来构造一个RestTemplate,可以自定义一些连接参数,如:连接超时时间,读取超时时间,还有认证信息等

@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder
                //设置连接超时时间
                .setConnectTimeout(Duration.ofSeconds(5000))
                //设置读取超时时间
                .setReadTimeout(Duration.ofSeconds(5000))
                //设置认证信息
                .basicAuthentication("username","password")
                //设置根路径
                .rootUri("https://api.test.com/")
                //构建
                .build();
    }
    // 或者直接进行实例化
   // return new RestTemplate();
}

方法二:

在项目启动实例化这个方法即可

    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

📌 GET请求

Get请求的话可以直接在拼接请求路径后直接拼接参数/app/order/getNumber?name=name,也可以使用占位符/app/order/getNumber?name={name},通过Map来传参,但不能使用LinkedMultiValueMap,否则会报错
public void queryWeather() {
        ResponseEntity<Object> forEntity = restTemplate.getForEntity("https://restapi.amap.com/v3/weather/weatherInfo?city=510100&key=e7a5fa943f706602033b6b329c49fbc6", Object.class);
        System.out.println("状态码:"+forEntity.getStatusCode());
        System.out.println("状态码内容:"+forEntity.getStatusCodeValue());
        HttpHeaders headers = forEntity.getHeaders();
        System.out.println("响应头:"+headers);
        Object body = forEntity.getBody();
        System.out.println("响应内容:"+body);
    }
    String url = "https://xx.xx.com/app/order/getNumber?name={name}";
    Map<String, Object> paramMap = new HashMap<String, Object>();
    paramMap.add("name", "name");
    HttpHeaders headers = new HttpHeaders();
    HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(null,headers);
    //使用另一个重载的方法传递参数集合paramMap
    ResponseEntity<String> response = template.exchange(url, HttpMethod.GET, httpEntity, String.class,paramMap);

📌 POST请求

在这里插入图片描述

post请求需要用LinkedMultiValueMap来传递参数
String url = "https://xx.xx.com/app/order/getNumber";
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
paramMap.add("name", "name");
HttpHeaders headers = new HttpHeaders();
//headers可以详细设置请求头中的信息等
//HttpEntity里面包含了请求方和相应方的请求头和请求体,类似于@RequestBody和@ResponseBody
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
ResponseEntity<String> response = template.exchange(url, HttpMethod.POST, httpEntity, String.class)

📌 DELETE

​ 与PUT一样,DELETE方法只有一类

📌 HEADER

HEADER也只有一类方法 : ​ 主要用来发送请求获取响应头部信息,但是像DELETE、PUT这类没有响应的方法,是不能使用该方法的(因为没有响应也就没有响应头了)。

  • public HttpHeaders headForHeaders()

📌 OPTIONS

​ 该方法的主要用来判断该服务地址,能够使用那种方法去执行

  • public Set optionsForAllow()
    @Test
    void contextLoads() {
        //请求地址
        String url = "http://httpbin.org/get";
        Set<HttpMethod> httpMethods = restTemplate.optionsForAllow(url);
        System.out.println(httpMethods);
    }

📌 EXCHANGE

  • ResponseEntity exchange()
  • ​ 该接口与其他接口不同:
  1. 该方法允许用户指定请求的方法(get,post,put等)
  2. 可以在请求中增加body以及头信息,其内容通过参数HttpEntity<?> requestEntity描述
  3. exchange支持’含参数的类型(即泛型)'作为返回类型,该特性通通ParameterizedTypeReferenceresponseType 描述
  • *该方法支持五个参数

服务地址 / 请求方法 / 写入的请求实体 / 响应内容的类型 / 扩展模板的变量或包含URI模板变量的映射*

@Test
void contextLoads() {
    //请求地址
    String url = "http://httpbin.org/post";
    User user = new User();
    user.setName("彭于晏");
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<User> userHttpEntity = new HttpEntity<>(user, httpHeaders);
    ResponseEntity<Object> exchange = restTemplate.exchange(url, HttpMethod.POST, userHttpEntity, Object.class);
    System.out.println(exchange);
}

​ 上述代码模拟了一个简单的POST请求 可以理解为可以动态的指定请求方法和请求实体的一个方法

exchange(String url, HttpMethod method,@Nullable HttpEntity<?> requestEntity, Class responseType, Map

  • 参数说明:

url:请求路径
method:请求的方法(GET、POST、PUT等)
requestEntity:HttpEntity对象,封装了请求头和请求体
responseType:返回数据类型
uriVariables:支持PathVariable类型的数据。

java的 RestTemplate中的exchange()方法 允许指定 post, get等方法,比 execute()方法应用更广

📌 EXECUTE

  • T execute()

​ 该方法就是执行请求的方法,我们可以发现上述的所有方法的最后执行都是调用的该方法执行;

  • *该方法支持五个参数

服务URL地址 / 请求方法 / 准备请求的对象(requestCallback) / 从响应中提取返回值的对象 / 扩展模板的变量或包含URI模板变量的映射*

🍀 总结

  • get和post请求适合用在不许要校验直接获取的接口, 如果想获取http协议报文的内容可以使用 xxxForEntity,如果只关注传输数据本身可以使用xxxForObjec
  • DELETE ,HEAD, OPTIONS 可以补充部分信息
  • EXCHANGE 使用频率较高
  • EXECUTE 上面所有方法的最后执行都是调用的该方法执行

🍀 参考资料 & 致谢

RestTemplate

目录
相关文章
|
6天前
|
Java 应用服务中间件 数据库连接
Java 新手入门:Spring Boot 启动揭秘,小白也能秒懂的超详细指南
Java 新手入门:Spring Boot 启动揭秘,小白也能秒懂的超详细指南
23 2
|
5天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
5天前
|
Java
Java aop 如何获取请求头里的token
【8月更文挑战第13天】Java aop 如何获取请求头里的token
16 0
|
3天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
5天前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
6天前
|
安全 Java 开发者
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
14 1
|
4天前
|
缓存 Java Spring
Java本地高性能缓存实践问题之的Spring Boot中启用缓存支持问题如何解决
Java本地高性能缓存实践问题之的Spring Boot中启用缓存支持问题如何解决
|
6天前
|
设计模式 前端开发 Java
Spring,作为Java程序员的你能想到什么呢?
该文章主要介绍了Spring框架对于Java程序员的意义,包括Spring框架的一些核心能力和为什么它是如此重要。
|
6天前
|
JavaScript 前端开发 网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
20 0
|
6天前
|
前端开发 Java Spring
Java 新手入门:Spring Boot 轻松整合 Spring 和 Spring MVC!
Java 新手入门:Spring Boot 轻松整合 Spring 和 Spring MVC!
18 0