RestTemplate作为SpringBoot的Http请求顶层客户端,其规范定义了Http请求接口模板,而真正的执行请求可以对接各个实现方,可以是JDK的原始http请求,OkHttp3,HttpClient等等。

RestTemplate

先看看其类UML图
image.png

  1. public abstract class HttpAccessor {
  2. // 请求客户端工厂
  3. private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
  4. // 通过工厂,创建客户端请求信息封装实例
  5. protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
  6. ClientHttpRequest request = getRequestFactory().createRequest(url, method);
  7. return request;
  8. }
  9. // 省略set/get
  10. }

仅仅提供了请求客户端创建工厂封装,在构造方法或修改创建客户端请求工厂后可以有不同的实现,从而达到切换底层客户端。
image.png

InterceptingHttpAccessor
  1. public abstract class InterceptingHttpAccessor extends HttpAccessor {
  2. // 拦截器列表
  3. private final List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
  4. // 增加带插件客户端工厂
  5. @Nullable
  6. private volatile ClientHttpRequestFactory interceptingRequestFactory;
  7. // 若存在拦截器,那么客户端工厂用InterceptingClientHttpRequestFactory进行增强
  8. @Override
  9. public ClientHttpRequestFactory getRequestFactory() {
  10. List<ClientHttpRequestInterceptor> interceptors = getInterceptors();
  11. if (!CollectionUtils.isEmpty(interceptors)) {
  12. ClientHttpRequestFactory factory = this.interceptingRequestFactory;
  13. if (factory == null) {
  14. // 进行装饰增强
  15. factory = new InterceptingClientHttpRequestFactory(super.getRequestFactory(), interceptors);
  16. this.interceptingRequestFactory = factory;
  17. }
  18. return factory;
  19. } else {
  20. return super.getRequestFactory();
  21. }
  22. }
  23. }

拦截器在原本的请求上增加了装饰逻辑,再执行拦截器在执行具体的请求。

ClientHttpRequest请求信息封装

image.png

接口方法定义

image.png
可见具体执行Http请求的实体,依然是HttpClientRequest,其根据不同的提供方有很多种实现,我们可以任意配置,从这里我们可以看出RestTemplate就是一个客户端模板,统一了上层使用方,而不必关心下层实现,这也符合Spring的各种XXXTemplate设计风格。