在服务调用时候spring-web已经为我们封装好了2个client模板:
- 同步调用的 RestTemplate
- 支持异步调用的AsyncRestTemplate
本文简单概述这2种模版的使用方式, 涉及相关细节后面的文章逐步讲解
RestTemplate描述
首先来开RestTemplate ,先看一下这个类的关系图1-1
![](https://i-blog.csdnimg.cn/blog_migrate/a46a712db32d0d28fcc64d8567d030b8.png)
从中可以看到RestTemplate 开放出来可供用户操作的一些操作口子
-
requestFactory: 这个是用于创建request的工厂. 默认为SimpleClientHttpRequestFactory();
-
interceptors:这个是在发出请求前个用户一个可以切入操作的地方. 默认为空
-
messageConverters: 在post请求和resp回来时对数据的处理转化; 对messageConverter的选择是基于请求header中的Content-Type
-
errorHandler: 处理失败的handler.
RestTemplate请求处理
RestTemplate中提供了GET/POST/HEAD/PUT/PATCH/DELETE 方法(区别建wiki), 但最后都汇聚到doExecute这个方法
protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
ResponseExtractor<T> responseExtractor) throws RestClientException {
.......
ClientHttpRequest request = createRequest(url, method); //1.获取request
if (requestCallback != null) {
requestCallback.doWithRequest(request); //2.处理request
}
response = request.execute(); //3.执行
handleResponse(url, method, response); //4.错误处理
if (responseExtractor != null) {
return responseExtractor.extractData(response); //5.解析response
}
else {
return null;
}
........
}
- 获取request: 是通过
requestFactory.createRequest(url, method), 下图(1-2,1-3)为spring-web提供的factory 和对应创建ClientHttpRequest类图;选择很多看具体业务需求
- 处理request: 根据requestCallback 类型
AcceptHeaderRequestCallback: 对于GET请求使用B只处理header中的Accept类型 HttpEntityRequestCallback(继承AcceptHeaderRequestCallback): 对于其他请求使用A处理设置header, 还要对请求数据进行convert处理
- 执行: 使用上面创建的具体ClientHttpRequest对服务器请求----这个地方以后展开细说
- 错误处理: 如果返回的http code是4xx或者5xx时, 会使用errorHandler进行处理
- 解析response: 有3种实现
HeadersExtractor 对HEAD请求返回的resp处理提取需要的header ResponseEntityResponseExtractor 返回ResponseEntity HttpMessageConverterExtractor 根据responseType选择需要messageConverter把http返回报文转化为预定义的类型
![](https://i-blog.csdnimg.cn/blog_migrate/fe51a72546eab9d87b1078c7a599b4c7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/674faa388cffaa202615ddf68e5620be.png)
AsyncRestTemplate描述
![](https://i-blog.csdnimg.cn/blog_migrate/912a68c25747a44f2b2ecbad3f2827b4.png)
和同步的Template类似,但AsyncRestTemplate中持有一个RestTemplate的实例,在构造方法中创建的. AsyncRestTemplate将messageConvert相关的处理委托给RestTemplate处理(包括请求报文和返回报文)
AsyncRestTemplate处理
提供请求处理的方法也是类似的,只不过调用后会立即返回一个ResponseExtractorFuture, 使用者需要为ResponseExtractorFuture添加必须的callback,
void addCallback(ListenableFutureCallback<? super T> callback);
和
void addCallback(SuccessCallback<? super T> successCallback, FailureCallback failureCallback);
当请求返回时会触发用户的callback进行相应处理.
doExecute关键代码如下:
AsyncClientHttpRequest request = createAsyncRequest(url, method); //1.创建request
if (requestCallback != null) {
requestCallback.doWithRequest(request); //2.request处理
}
ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync(); //3.执行
return new ResponseExtractorFuture<T>(method, url, responseFuture, responseExtractor); //4.返回
- 创建request: 是通过
requestFactory.createAsyncRequest(url, method) 下图(1-5,1-6)为spring-web提供的异步AsyncRequestFactory 和对应创建AsyncClientHttpRequest类图;选择很多看具体业务需求
- 处理request: 委托RestTemplate处理, 同RestTemplate的处理逻辑
- 执行: AsyncClientHttpRequest的具体实现类进行处理, 返回future
- 包装成ResponseExtractorFuture返回
![](https://i-blog.csdnimg.cn/blog_migrate/48127be89bb062b5c60fa77663d25fd1.png)
这些factory大部分都同时实现同步和异步接口,
![](https://i-blog.csdnimg.cn/blog_migrate/de51e6804d6e9862efaf713369c77aa8.png)
这个里面Netty4ClientHttpRequest是同时实现同步和异步的request, 后面会对此详细分析