RestTemplate作为SpringBoot的Http请求顶层客户端,其规范定义了Http请求接口模板,而真正的执行请求可以对接各个实现方,可以是JDK的原始http请求,OkHttp3,HttpClient等等。
RestTemplate
先看看其类UML图
public abstract class HttpAccessor {
// 请求客户端工厂
private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
// 通过工厂,创建客户端请求信息封装实例
protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
ClientHttpRequest request = getRequestFactory().createRequest(url, method);
return request;
}
// 省略set/get
}
仅仅提供了请求客户端创建工厂封装,在构造方法或修改创建客户端请求工厂后可以有不同的实现,从而达到切换底层客户端。
InterceptingHttpAccessor
public abstract class InterceptingHttpAccessor extends HttpAccessor {
// 拦截器列表
private final List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
// 增加带插件客户端工厂
@Nullable
private volatile ClientHttpRequestFactory interceptingRequestFactory;
// 若存在拦截器,那么客户端工厂用InterceptingClientHttpRequestFactory进行增强
@Override
public ClientHttpRequestFactory getRequestFactory() {
List<ClientHttpRequestInterceptor> interceptors = getInterceptors();
if (!CollectionUtils.isEmpty(interceptors)) {
ClientHttpRequestFactory factory = this.interceptingRequestFactory;
if (factory == null) {
// 进行装饰增强
factory = new InterceptingClientHttpRequestFactory(super.getRequestFactory(), interceptors);
this.interceptingRequestFactory = factory;
}
return factory;
} else {
return super.getRequestFactory();
}
}
}
拦截器在原本的请求上增加了装饰逻辑,再执行拦截器在执行具体的请求。
ClientHttpRequest请求信息封装
接口方法定义
可见具体执行Http请求的实体,依然是HttpClientRequest,其根据不同的提供方有很多种实现,我们可以任意配置,从这里我们可以看出RestTemplate就是一个客户端模板,统一了上层使用方,而不必关心下层实现,这也符合Spring的各种XXXTemplate设计风格。