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


    🍀简介

    • 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();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    方法二:

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

        @Bean
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
    • 1
    • 2
    • 3
    • 4

    📌 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);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
        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);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    📌 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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    📌 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);
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    📌 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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ​ 上述代码模拟了一个简单的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

  • 相关阅读:
    windows安装docker,解决require wsl 2问题
    苹果电脑怎么清理垃圾和缓存文件,mac如何清理系统缓存文件
    【Java8新特性】- Lambda表达式
    2024050401-重学 Java 设计模式《实战代理模式》
    【小程序原生】
    设计模式之工厂模式
    10分钟!搞懂计算机CPU实现原理
    .NET微服务系统迁移至.NET6.0的故事
    XML-Based Configuration Beans for Ioc Container
    Linux shell脚本编程
  • 原文地址:https://blog.csdn.net/YangCheney/article/details/127329843