真不是我吹,Spring里这款牛逼的网络工具库我估计你都没用过

本文介绍了Spring的RestTemplate工具类,用于简化HTTP请求操作。内容包括RestTemplate在非Spring和Spring环境下的配置,以及GET、POST、PUT、DELETE请求的实践,还涉及通用的exchange方法和文件上传下载的示例。通过RestTemplate,开发者可以更高效地进行网络请求处理。
摘要由CSDN通过智能技术生成

一、简介

现如今的 IT 项目,由服务端向外发起网络请求的场景,基本上处处可见!

传统情况下,在服务端代码里访问 http 服务时,我们一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient,不过这种方法使用起来太过繁琐,而且 api 使用起来非常的复杂,还得操心资源回收。

以下载文件为例,通过 Apache 的 HttpClient方式进行下载文件,下面这个是我之前封装的代码逻辑,看看有多复杂!

其实Spring已经为我们提供了一种简单便捷的模板类来进行操作,它就是RestTemplate。

RestTemplate是一个执行HTTP请求的同步阻塞式工具类,它仅仅只是在 HTTP 客户端库(例如 JDK HttpURLConnection,Apache HttpComponents,okHttp 等)基础上,封装了更加简单易用的模板方法 API,方便程序员利用已提供的模板方法发起网络请求和处理,能很大程度上提升我们的开发效率。

好了,不多 BB 了,代码撸起来!

二、环境配置

2.1、非 Spring 环境下使用 RestTemplate

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

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

编写一个单元测试类,使用RestTemplate发送一个GET请求,看看程序运行是否正常

@Test
public void simpleTest() {
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://jsonplaceholder.typicode.com/posts/1";
    String str = restTemplate.getForObject(url, String.class);
    System.out.println(str);
}

2.2、Spring 环境下使用 RestTemplate

如果当前项目是SpringBoot,添加如下依赖接口!

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

同时,将RestTemplate配置初始化为一个Bean。

@Configuration
public class RestTemplateConfig {

    /**
     * 没有实例化RestTemplate时,初始化RestTemplate
     * @return
     */
    @ConditionalOnMissingBean(RestTemplate.class)
    @Bean
    public RestTemplate restTemplate(){
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate;
    }
}

注意,这种初始化方法,是使用了JDK自带的HttpURLConnection作为底层HTTP客户端实现。

当然,我们还可以修改RestTemplate默认的客户端,例如将其改成HttpClient客户端,方式如下:

@Configuration
public class RestTemplateConfig {


    /**
     * 没有实例化RestTemplate时,初始化RestTemplate
     * @return
     */
    @ConditionalOnMissingBean(RestTemplate.class)
    @Bean
    public RestTemplate restTemplate(){
        RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
        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);
    }

}

在需要使用RestTemplate的位置,注入并使用即可!

@Autowired
private RestTemplate restTemplate;

从开发人员的反馈,和网上的各种HTTP客户端性能以及易用程度评测来看,OkHttp 优于 Apache的HttpClient、Apache的HttpClient优于HttpURLConnection。

因此,我们还可以通过如下方式,将底层的http客户端换成OkHttp!

/**
 * 使用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);
}

三、API 实践

RestTemplate最大的特色就是对各种网络请求方式做了包装,能极大的简化开发人员的工作量,下面我们以GET、POST、PUT、DELETE、文件上传与下载为例,分别介绍各个API的使用方式!

3.1、GET 请求

通过RestTemplate发送HTTP GET协议请求,经常使用到的方法有两个:

  • getForObject()
  • getForEntity()

二者的主要区别在于,getForObject()返回值是HTTP协议的响应体。

getForEntity()返回的是ResponseEntity,ResponseEntity是对HTTP响应的封装,除了包含响应体,还包含HTTP状态码、contentType、contentLength、Header等信息。

在Spring Boot环境下写一个单元测试用例,首先创建一个Api接口,然后编写单元测试进行服务测试。

  • 不带参的get请求
@RestController
public class TestController {

    /**
     * 不带参的get请求
     * @return
     */
    @RequestMapping(value = "testGet", method = RequestMethod.GET)
    public ResponseBean testGet(){
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面对没有使用过Spring Cloud的情况,你可以这样应对面试问题: 1. 了解Spring Cloud的基本概念和特点:提前熟悉Spring Cloud的原理和架构,了解它是一个基于Spring Framework的开发工具集合,用于构建分布式系统的微服务架构。 2. 学习Spring Cloud的相关组件:虽然没有实际经验,但可以通过阅读官方文档、教程和相关书籍,了解Spring Cloud中常用的组件和功能,例如服务注册与发现(Eureka、Consul)、服务网关(Zuul、Gateway)、配置中心(Config)、服务调用(Feign、Ribbon)等。 3. 强调自己熟悉类似技术或框架:如果你有其他类似的开发经验,如Dubbo、Kubernetes等,可以强调自己对分布式系统和微服务架构的了解,以及与Spring Cloud相似的概念和原理。 4. 强调学习能力和问题解决能力:虽然没有具体使用过Spring Cloud,但可以强调自己有很强的学习能力和解决问题的能力,愿意迅速学习并适应新的技术和框架,在经验不足的情况下,可以通过查阅资料、实践和与同事的合作来快速提升自己的技术水平。 5. 举例说明对分布式系统的理解:可以通过举一些实际开发场景或工作经历,与面试官讨论如何设计和实现某个分布式系统,以展示你对分布式系统的理解和如何解决相关问题的思维能力。 面试时,重要的是表达自己对技术和概念的理解,以及学习和解决问题的能力。尽量使面试官相信你具备快速学习和适应新技术的能力,并能在实际项目中应用所学知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值