在Spring项目中,通常会借助RestTemplate来实现网络请求,RestTemplate封装得很完善了,基本上可以非常简单的完成各种HTTP请求,本文主要介绍一下基本操作,最常见的GET/POST请求的使用姿势
I. 项目搭建
1. 配置
借助SpringBoot搭建一个SpringWEB项目,提供一些用于测试的REST服务
- SpringBoot版本:
2.2.1.RELEASE - 核心依赖:
spring-boot-stater-web
1 | <dependencies> |
为了后续输出的日志更直观,这里设置了一下日志输出格式,在配置文件application.yml中,添加
1 | logging: |
2. Rest服务
添加三个接口,分别提供GET请求,POST表单,POST json对象,然后返回请求头、请求参数、cookie,具体实现逻辑相对简单,也不属于本篇重点,因此不赘述说明
1 |
|
II. RestTemplate示例
1. Get请求
使用RestTemplate发起GET请求,通常有两种常见的方式
- getForEntity: 返回的正文对象包装在
HttpEntity实体中,适用于获取除了返回的正文之外,对返回头、状态码有需求的场景 - getForObject: 返回正文,适用于只对正文感兴趣的场景
上面这两种方法除了返回结果不同之外,其他的使用姿势基本一样,有三种
1 |
|
上面三个重载方法,区别仅在于GET参数如何处理,下面给出一个实例进行说明
1 | /** |
输出结果如下:
1 | (Simple getForEntity res: <200,params: {"name":["一灰灰Blog"],"age":["20"]} |
2. POST表单
POST表单属于非常基础的请求方式了,根据返回结果,RestTemplate同样提供了两种姿势
- postForEntity: 返回的正文封装在HttpEntity
- postForObject: 直接返回正文对象
它的使用姿势一样有三种
1 |
|
请注意上面三个方法的前两个,后面的uriVariables是url参数,不是POST表单参数哦,它们之间是有区别的(虽然我们一般post提交表单时,不怎么会在url中添加参数)
下面还是根据实际的用例来查看
1 | /** |
测试输出如下
1 | (Simple postForEntity res: <200,params: {"name":["一灰灰Blog"],"age":["20"]} |
3. post body
post一个json串,也属于比较常见的一种case了,对于RestTemplate而言,要支持这种方式,需要额外处理一下请求头,设置Content-Type为application/json
使用姿势和上面相差不大,只是需要注意一下请求参数的构建
1 | /** |
输出如下
1 | (json post res: params: {} | DemoRest.ReqBody(name=???Blog, age=20) |
请注意,提交的json串中文乱码了
4. 小结
上面主要介绍的是RestTemplate的常规用法,基础的GET/POST请求姿势,如果业务简单,不需要考虑各种复杂的异常情况,也是没有太多的问题了;那么如果需要考虑,又有哪些需要注意的呢?
- 上面的中文乱码问题如何解决?
- 自定义的请求头如何塞入(如果是爬虫,上面的User-Agent太容易被屏蔽了)
- cookie设置
- REST支持Basic Auth的验证方式如何发起请求
- 超时设置
- 自定义连接池替换
- REST返回非200状态码的情况,能否不抛异常,自定义处理?
- ssl校验
- …
如果你对上面的这些点感兴趣,不妨关注一波,相关的文章快正热火朝天的进行中…
II. 其他
0. 项目
- 工程:https://github.com/liuyueyi/spring-boot-demo
- 项目: https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/221-web-resttemplate
1. 一灰灰Blog
尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
- 一灰灰Blog个人博客 https://blog.hhui.top
- 一灰灰Blog-Spring专题博客 http://spring.hhui.top
