RestTemplate
介绍
借鉴
https://juejin.im/post/6844903842065154061 掘金
认识 RestTemplate
简要改过:HTTP请求工具,封装了HttpClient请求的一系列方法
所属:spring.web 包 4.1.3 之后
Spring Framework 3.0之后才开始引入
为什么会出现RestTemplate
- 最大的作用就是简化Http请求。
- 无需自己编写底层
- 开箱即用
Spring 5.0之后的改变
5.0之后,官方更加推荐应对非阻塞响应式的 HTTP 请求处理类 org.springframework.web.reactive.client.WebClient
来处理
一些常用API
其中多数是单个方法重载实现,这里我主要参考官方文档 rest-client-access 进行如下分类:
方法名 | 描述 |
---|---|
getForObject |
通过 GET 请求获得响应结果 |
getForEntity |
通过 GET 请求获取 ResponseEntity 对象,包容有状态码,响应头和响应数据 |
headForHeaders |
以 HEAD 请求资源返回所有响应头信息 |
postForLocation |
用 POST 请求创建资源,并返回响应数据中响应头的字段 Location 的数据 |
postForObject |
通过 POST 请求创建资源,获得响应结果 |
put |
通过 PUT 方式请求来创建或者更新资源 |
patchForObject |
通过 PATH 方式请求来更新资源,并获得响应结果。(JDK HttpURLConnection 不支持 PATH 方式请求,其他 HTTP 客户端库支持) |
delete |
通过 DELETE 方式删除资源 |
optionsForAllow |
通过 ALLOW 方式请求来获得资源所允许访问的所有 HTTP 方法,可用看某个请求支持哪些请求方式 |
exchange |
更通用版本的请求处理方法,接受一个 RequestEntity 对象,可以设置路径,请求头,请求信息等,最后返回一个 ResponseEntity 实体 |
execute |
最通用的执行 HTTP 请求的方法,上面所有方法都是基于 execute 的封装,全面控制请求信息,并通过回调接口获得响应数据 |
常见用法:
GET 请求:
使用GET请求获取JSON字符串:
我们只需要调用:getForObject
即可
1 | String forObject = build.getForObject("http://www.baidu.com", String.class); |
使用GET请求获取JSON映射对象:
只需要将后面的参数改为 对应实体对象即可
1 | Product forObject = build.getForObject("http://www.baidu.com", Product.class); |
使用GET请求获取更加详细的Entity对象
使用getForEntity
即可获取更为详细的对象
1 | ResponseEntity<String> forEntity = build.getForEntity("http://www.baidu.com", String.class); |
构建自定义的请求头:
1 | MultiValueMap header = new LinkedMultiValueMap(); |
构建自定义请求header
一般使用exchange
的相关方法
1 | ResponseEntity<String> exchange = build.exchange("http://www.baidu.com", HttpMethod.GET, requestEntity, String.class); |
手动处理请求头以及返回信息
1 | build.execute("http://www.baidu.com", HttpMethod.GET, request -> { |
这里有两个比较关键的接口
RequestCallback requestCallback,
ResponseExtractor
可以使用lambada 表达式简化,或者使用匿名内部类
使用带参数的Get请求
- 首先我们需要定义占位符
1 | String url ="htttp://localhost:8080?id={id}" |
注意{id} 的写法,有点像@PathValiable
的写法
使用动态参数:
1 | // 带参数的GET请求 |
使用map设置参数
1 | // 使用map 设置参数 |
POST 请求:
Post请求相对GET请求有更多的变化,这里也是列出日常开放比较常用的点
发送 Content-Type
为 application/x-www-form-urlencoded
的 POST 请求:
1 | // 设置请求头 |
发送 Content-Type
为 application/json
的 POST 请求:
只需要将上面的案例当中的:
MediaType.APPLICATION_FORM_URLENCODED_VALUE
改为:MediaType.APPLICATION_JSON_VALUE
即可
DELETE 请求以及PUT请求
因为都是RestFul
的请求,所以简单描述
1 | String url = "http://localhost:8080/product/update"; |
使用restTemplate实现文件上传
- 需要设置multitype/file 文件请求头
- 需要设置headaer 以及 body
- 只能使用post请求
1 | String ui = ""; |
进阶 RestTemplate
如何设置RestTempalate的默认底层引擎
RestTemplate 默认使用的引擎:
- Apache HttpComponents
- Netty
- OkHttp
一句话概括:
1 | RestTemplate template = new RestTemplate(new HttpComponentsClientHttpRequestFactory()); |
如何修改RestTemplate 的超时时间
参考代码:
1 | RestTemplate customRestTemplate = new RestTemplate(getClientHttpRequestFactory()); |
如果要调整 HttpComponentsClient
的超时设置,可以参考文章resttemplate-timeout-example 。当然除了设置超时时间之外,还有更多参数进行定制,这里就不一一列举,可以参考文章 resttemplate-httpclient-java-config 进一步学习。
参考资料
www.baeldung.com/rest-templa…
blog.didispace.com/spring-boot…
www.baeldung.com/spring-rest…
www.zhihu.com/question/28…
howtodoinjava.com/spring-boot…
docs.spring.io/spring/docs…
zh.wikipedia.org/wiki/表现层状态转…
docs.spring.io/spring-fram…
作者:闻人的技术博客 链接:https://juejin.im/post/6844903842065154061 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。