
真不是我吹,Spring里这款牛逼的网络工具库我估计你都没用过!
一、简介
现如今的 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类
编写一个单元测试类,使用RestTemplate发送一个GET请求,看看程序运行是否正常
2.2、Spring 环境下使用 RestTemplate
如果当前项目是SpringBoot,添加如下依赖接口!
同时,将RestTemplate配置初始化为一个Bean。
注意,这种初始化方法,是使用了JDK自带的HttpURLConnection作为底层HTTP客户端实现。
当然,我们还可以修改RestTemplate默认的客户端,例如将其改成HttpClient客户端,方式如下:
在需要使用RestTemplate的位置,注入并使用即可!
从开发人员的反馈,和网上的各种HTTP客户端性能以及易用程度评测来看,OkHttp 优于 Apache的HttpClient、Apache的HttpClient优于HttpURLConnection。
因此,我们还可以通过如下方式,将底层的http客户端换成OkHttp!
三、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请求
● 带参的get请求(restful风格)
● 带参的get请求(使用占位符号传参)
上面的所有的getForObject请求传参方法,getForEntity都可以使用,使用方法上也几乎是一致的,只是在返回结果接收的时候略有差别。
使用ResponseEntity<T> responseEntity来接收响应结果。用responseEntity.getBody()获取响应体。
3.2、POST 请求
其实POST请求方法和GET请求方法上大同小异,RestTemplate的POST请求也包含两个主要方法:
● postForObject()
● postForEntity()
postForEntity()返回全部的信息,postForObject()方法返回body对象,具体使用方法如下!
● 模拟表单请求,post方法测试
● 模拟表单请求,post方法测试(对象接受)
● 模拟 JSON 请求,post 方法测试
● 模拟页面重定向,post请求
输出结果如下:
3.3、PUT 请求
put请求方法,可能很多人都没用过,它指的是修改一个已经存在的资源或者插入资源,该方法会向URL代表的资源发送一个HTTP PUT方法请求,示例如下!
3.4、DELETE 请求
与之对应的还有delete方法协议,表示删除一个已经存在的资源,该方法会向URL代表的资源发送一个HTTP DELETE方法请求。
3.5、通用请求方法 exchange 方法
如果以上方法还不满足你的要求。在RestTemplate工具类里面,还有一个exchange通用协议请求方法,它可以发送GET、POST、DELETE、PUT、OPTIONS、PATCH等等HTTP方法请求。
打开源码,我们可以很清晰的看到这一点。
采用exchange方法,可以满足各种场景下的请求操作!
3.6、文件上传与下载
除了经常用到的get和post请求以外,还有一个我们经常会碰到的场景,那就是文件的上传与下载,如果采用RestTemplate,该怎么使用呢?
案例如下,具体实现细节参考代码注释!
● 文件上传
● 文件下载
这种下载方法实际上是将下载文件一次性加载到客户端本地内存,然后从内存将文件写入磁盘。这种方式对于小文件的下载还比较适合,如果文件比较大或者文件下载并发量比较大,容易造成内存的大量占用,从而降低应用的运行效率。
● 大文件下载
这种下载方式的区别在于:
● 设置了请求头APPLICATION_OCTET_STREAM,表示以流的形式进行数据加载
● RequestCallback结合File.copy保证了接收到一部分文件内容,就向磁盘写入一部分内容。而不是全部加载到内存,最后再写入磁盘文件。
在下载大文件时,例如excel、pdf、zip等等文件,特别管用,
四、小结
通过本章的讲解,想必读者初步的了解了如何使用RestTemplate方便快捷的访问restful接口。其实RestTemplate的功能非常强大,作者也仅仅学了点皮毛。如果大家觉得本文有什么地方没写清楚的或者有其他什么想要了解的可以在下方留言,我后续会尽量在文中进行补充完善!
五、参考
1、低调的微胖 - RestTemplate 介绍
2、baeldung - restTemplate 介绍
3、rest - springboot集成
4、Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
5、文件上传下载与大文件流式下载
文章转载自公众号:Java极客技术
