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<>();// 增加带插件客户端工厂@Nullableprivate volatile ClientHttpRequestFactory interceptingRequestFactory;// 若存在拦截器,那么客户端工厂用InterceptingClientHttpRequestFactory进行增强@Overridepublic 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设计风格。
