【微服务~远程调用】RestTemplate基本操作快速入门

举报
陶然同学 发表于 2022/06/23 00:36:38 2022/06/23
2.2k+ 0 0
【摘要】 🔎这里是【微服务~远程调用】,关注我学习云原生不迷路 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏⭐️ 👀专栏介绍 【微服务~远程调用】 目前主要更新微服务,一起学习一起进步。 👀本期介绍 本期主要介绍RestTemplate基本操作快速入门 文章目录 RestTemplate ...

🔎这里是【微服务~远程调用】,关注我学习云原生不迷路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位🔎点赞👍评论收藏⭐️

👀专栏介绍

【微服务~远程调用】 目前主要更新微服务,一起学习一起进步。

👀本期介绍

本期主要介绍RestTemplate基本操作快速入门

文章目录

RestTemplate

概述

搭建环境

基本操作

HttpClient高级

SpringBoot整合HttpClient

概述

配置

测试:get请求

         RestTemplate整合HttpClient

案例:管理员登录

分析

数据库

RestTemplate

概述

  • RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

搭建环境

  • 拷贝BaseResult

  • 编写测试类:TestRest


      package com.czxy;
      public class TestRest {
      }
  
 

基本操作

GET请求

  • 注意:使用RestTemplate封装数据时,BaseResult必须提供==无参构造==。


      @Test
         public void testFindAll(){
              String url = "http://localhost:7778/user";
             //1 创建对象
              RestTemplate restTemplate = new RestTemplate();
             //2 发送请求并获得数据
              ResponseEntity<BaseResult> entity = restTemplate.getForEntity(url, BaseResult.class);
             //3.1 状态
              System.out.println(entity.getStatusCode());
             //3.2 响应数据
              System.out.println(entity.getBody().getData());
          }
  
 

GET请求:转换泛型异常

  • 查询用户时,如果返回类型为BaseResult,默认不支持泛型信息。及不支持 BaseResult<List<User>>

    • 需要使用 exchange 设置具体的泛型信息


      @Test
         public void testFindAll2(){
             String url = "http://localhost:7778/user";
             //1 创建对象
             RestTemplate restTemplate = new RestTemplate();
             //2 发送请求并获得数据
             ResponseEntity<BaseResult<List<User>>> entity = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<BaseResult<List<User>>>() {});
             //3 获得响应,并打印
             BaseResult<List<User>> baseResult = entity.getBody();
             List<User> data = baseResult.getData();
             for (User user : data) {
                 System.out.println(user);
              }
          }
  
 

POST请求


      @Test
         public void testAdd(){
              String url = "http://localhost:7778/user";
              RestTemplate restTemplate = new RestTemplate();
              User user = new User(1,"jack","1234",18);
              ResponseEntity<BaseResult> entity = restTemplate.postForEntity(url ,user , BaseResult.class);
              System.out.println(entity.getStatusCode());
              System.out.println(entity.getBody());
          }
  
 

PUT请求


      @Test
         public void testUpdate(){
             String url = "http://localhost:7778/user";
             RestTemplate restTemplate = new RestTemplate();
             User user = new User(1,"jack","1234",18);
              restTemplate.put(url ,user);
              System.out.println("修改成功");
          }
  
 

Delete请求


      @Test
         public void testDelete(){
             String url = "http://localhost:7778/user/1";
             RestTemplate restTemplate = new RestTemplate();
              restTemplate.delete(url);
             System.out.println("删除成功");
          }
  
 

HttpClient高级

HttpClient 关闭日志输出

  • 基于spring boot 测试启动器,自动开启日志输出

  • spring boot 默认采用logback 进行日志管理的

  • 如何管理日志输出:关闭日志输出

    • 在resources/logback.xml

<configuration debug="false"></configuration>
 

HttpClient连接池

  • 分析

    • 使用HttpClients.custom()可以构建自定义 CloseableHttpClient 对象

      • setConnectionManager 用于配置连接

      • setDefaultRequestConfig 用于配置请求

    • 通过PoolingHttpClientConnectionManager 可以为连接配置连接数和并发数

    • 通过 RequestConfig.custom() 可以配置各种超时时间

  • 代码


         @Test
         public void testDemo01() throws IOException {
             //1 配置连接管理
             PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
             // 1.1 设置最大连接数
              connectionManager.setMaxTotal(1000);
             // 1.2 设置并发访问数
              connectionManager.setDefaultMaxPerRoute(20);
             //2 请求配置
             RequestConfig requestConfig = RequestConfig.custom()
                      .setConnectTimeout(1000)
                      .setConnectionRequestTimeout(500)
                      .setSocketTimeout(10 * 1000)
                      .build();
             // 3 获得工具类
             CloseableHttpClient httpClient = HttpClients.custom()
                      .setConnectionManager(connectionManager)
                      .setDefaultRequestConfig(requestConfig)
                     //重定向策略
                      .setRedirectStrategy(new LaxRedirectStrategy())
                      .build();
             // 4 发送请求
             CloseableHttpResponse response = null;
             try {
                 HttpGet httpGet = new HttpGet("http://localhost:7778/user");
                  response = httpClient.execute(httpGet);
                 if(response.getStatusLine().getStatusCode() == 200){
                     String str = EntityUtils.toString(response.getEntity(),"UTF-8");
                      System.out.println(str);
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              } finally {
                  response.close();
              }
          }
  
 

SpringBoot整合HttpClient

概述

  • SpringBoot官方并没有对HttpClient的启动器。所以我们需要自己完成配置

配置

  • 步骤一:修改yml文件,添加连接池配置


      # http配置
      http:
        maxTotal: 300
        defaultMaxPerRoute: 50
        connectTimeout: 1000
        connectionRequestTimeout: 500
        socketTimeout: 5000
  
 
  • 步骤二: 编写配置类

      package com.czxy.config;
      import lombok.Setter;
      import org.apache.http.client.HttpClient;
      import org.apache.http.client.config.RequestConfig;
      import org.apache.http.conn.HttpClientConnectionManager;
      import org.apache.http.impl.client.CloseableHttpClient;
      import org.apache.http.impl.client.HttpClients;
      import org.apache.http.impl.client.LaxRedirectStrategy;
      import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      @Configuration
      @ConfigurationProperties(prefix = "http")
      @Setter
      public class HttpConfig {
         private Integer maxTotal;
         private Integer defaultMaxPerRoute;
         private Integer connectTimeout;
         private Integer connectionRequestTimeout;
         private Integer socketTimeout;
         private Integer staleConnectionCheckEnabled;
         @Bean
         public PoolingHttpClientConnectionManager connectionManager(){
             //1 配置连接管理
             PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
             // 1.1 设置最大连接数
              connectionManager.setMaxTotal(maxTotal);
             // 1.2 设置并发访问数
              connectionMan1ager.setDefaultMaxPerRoute(defaultMaxPerRoute);
             return connectionManager;
          }
         @Bean
         public RequestConfig requestConfig(){
             //2 请求配置
             RequestConfig requestConfig = RequestConfig.custom()
                      .setConnectTimeout(connectTimeout)
                      .setConnectionRequestTimeout(connectionRequestTimeout)
                      .setSocketTimeout(socketTimeout)
                      .build();
             return requestConfig;
          }
         @Bean
         public HttpClient httpClient(HttpClientConnectionManager connectionManager, RequestConfig requestConfig){
             // 3 获得工具类
             CloseableHttpClient httpClient = HttpClients.custom()
                      .setConnectionManager(connectionManager)
                      .setDefaultRequestConfig(requestConfig)
                     //重定向策略
                      .setRedirectStrategy(new LaxRedirectStrategy())
                      .build();
             return httpClient;
          }
      }
  
 

测试:get请求


      package com.czxy;
      import org.apache.http.HttpResponse;
      import org.apache.http.client.HttpClient;
      import org.apache.http.client.methods.HttpGet;
      import org.apache.http.util.EntityUtils;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.test.context.junit4.SpringRunner;
      import javax.annotation.Resource;
      import java.io.IOException;
      @RunWith(SpringRunner.class)
      @SpringBootTest(classes = HttpApplication.class)
      public class TestBootHttp {
         @Resource
         private HttpClient httpClient;
         @Test
         public void testDemo01() throws IOException {
             String url = "http://localhost:7778/user";
             HttpGet httpGet = new HttpGet(url);
             HttpResponse response = httpClient.execute(httpGet);
             if(response.getStatusLine().getStatusCode() == 200){
                 String str = EntityUtils.toString(response.getEntity());
                  System.out.println(str);
              }
          }
      }
  
 

RestTemplate整合HttpClient

RestTemplate整合HttpClient -- 配置类


      package com.czxy.config;
      import lombok.Setter;
      import org.apache.http.client.HttpClient;
      import org.apache.http.client.config.RequestConfig;
      import org.apache.http.conn.HttpClientConnectionManager;
      import org.apache.http.impl.client.CloseableHttpClient;
      import org.apache.http.impl.client.HttpClients;
      import org.apache.http.impl.client.LaxRedirectStrategy;
      import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      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.http.converter.HttpMessageConverter;
      import org.springframework.http.converter.StringHttpMessageConverter;
      import org.springframework.web.client.RestTemplate;
      import java.nio.charset.Charset;
      import java.util.List;
      /**
       * @author 桐叔
       * @email liangtong@itcast.cn
       */
      @Configuration
      @ConfigurationProperties(prefix = "http")
      @Setter
      public class HttpConfig {
         private Integer maxTotal;
         private Integer defaultMaxPerRoute;
         private Integer connectTimeout;
         private Integer connectionRequestTimeout;
         private Integer socketTimeout;
         private Integer staleConnectionCheckEnabled;
         @Bean
         public PoolingHttpClientConnectionManager connectionManager(){
             //1 配置连接管理
             PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
             // 1.1 设置最大连接数
              connectionManager.setMaxTotal(maxTotal);
             // 1.2 设置并发访问数
              connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute);
             return connectionManager;
          }
         @Bean
         public RequestConfig requestConfig(){
             //2 请求配置
             RequestConfig requestConfig = RequestConfig.custom()
                      .setConnectTimeout(connectTimeout)
                      .setConnectionRequestTimeout(connectionRequestTimeout)
                      .setSocketTimeout(socketTimeout)
                      .build();
             return requestConfig;
          }
         @Bean
         public HttpClient httpClient(HttpClientConnectionManager connectionManager, RequestConfig requestConfig){
             // 3 获得工具类
             CloseableHttpClient httpClient = HttpClients.custom()
                      .setConnectionManager(connectionManager)
                      .setDefaultRequestConfig(requestConfig)
                     //重定向策略
                      .setRedirectStrategy(new LaxRedirectStrategy())
                      .build();
             return httpClient;
          }
         @Bean
         public ClientHttpRequestFactory requestFactory(HttpClient httpClient ){
             return new HttpComponentsClientHttpRequestFactory(httpClient);
          }
         @Bean
         public RestTemplate restTemplate(ClientHttpRequestFactory requestFactory){
             RestTemplate template = new RestTemplate(requestFactory);
             //乱码处理
              List<HttpMessageConverter<?>> list = template.getMessageConverters();
             for (HttpMessageConverter<?> mc : list) {
                 if (mc instanceof StringHttpMessageConverter) {
                      ((StringHttpMessageConverter) mc).setDefaultCharset(Charset.forName("UTF-8"));
                  }
              }
             return template;
          }
      }
  
 

测试类


      package com.czxy;
      import com.czxy.domain.User;
      import com.czxy.vo.BaseResult;
      import org.junit.Test;
      import org.junit.runner.RunWith;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.http.ResponseEntity;
      import org.springframework.test.context.junit4.SpringRunner;
      import org.springframework.web.client.RestTemplate;
      import javax.annotation.Resource;
      @RunWith(SpringRunner.class)
      @SpringBootTest(classes = HttpApplication.class)
      public class TestBootRest {
         @Resource
         private RestTemplate restTemplate;
         @Test
         public void testAdd(){
             String url = "http://localhost:7778/user";
             User user = new User(1,"jack","1234",18);
              ResponseEntity<BaseResult> entity = restTemplate.postForEntity(url ,user , BaseResult.class);
              System.out.println(entity.getStatusCode());
              System.out.println(entity.getBody());
          }
      }
  
 

案例:管理员登录

分析

数据库


      CREATE TABLE t_user(
        uid INT PRIMARY KEY AUTO_INCREMENT,
        username VARCHAR(50),
        `password` VARCHAR(32),
        age INT
      );
      INSERT INTO t_user(uid,username,`password`,age) VALUES(1,'jack','1234',18);
  
 

文章来源: blog.csdn.net,作者:陶然同学,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_45481821/article/details/125264143

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。