Spring - RestTemplate

219 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


RestTemplate

image.png

HttpAccessor

  1. ClientHttpRequestFactory 的setter/getter。默认是SimpleClientHttpRequestFactory
  2. List<ClientHttpRequestInitializer> clientHttpRequestInitializers 的 setter/getter。默认是空集合
  3. ClientHttpRequest 的创建方法createRequest()
  4. ClientHttpRequest 的初始化方法initialize(),供createRequest()方法内部获取ClientHttpRequest之后对其初始化。

主要能力是通过HttpAccessor.createRequest()获取ClientHttpRequest对象。

InterceptingHttpAccessor

  1. List<ClientHttpRequestInterceptor> interceptors 的setter/getter。作为拦截器列表,setter的时候AnnotationAwareOrderComparator.sort()方法有序存储。
  2. ClientHttpRequestFactory interceptingRequestFactory 的setter/getter。作为ClientHttpRequest的工厂。
  3. interceptingRequestFactory setter时调用HttpAccessor.setter()方法,将interceptingRequestFactory设置为null。
  4. interceptingRequestFactory getter时将HttpAccessor.ClientHttpRequestFactorythis.interceptors封装成InterceptingClientHttpRequestFactory返回。如果this.interceptors为空,返回setter时的ClientHttpRequestFactory

RestOperations

Interface specifying a basic set of RESTful operations.

getForObject
postForObject
put
delete
patchForObject

exchange

execute:真正执行请求的方法。

RestTemplate

  1. 序列化配置
  2. List<HttpMessageConverter<?>> messageConverters 消息转换器集合
  3. ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler() 响应错误处理器
  4. UriTemplateHandler uriTemplateHandler RUI模版处理器,拼接uriVariables到URI,供doExecute()使用。构造函数内调用initUriTemplateHandler()函数初始化。
  5. ResponseExtractor<HttpHeaders> headersExtractor = new HeadersExtractor() 响应头提取器。
  6. get/post/put/delete/patch方法
  7. exchange()
  8. execute() 方法执行真正的请求逻辑。

execute()方法

多个重载,为doExecute()方法整理入参。调用doExecute()方法执行真正的请求逻辑。

doExecute() 方法

  1. 创建请求

    调用HttpAccessor.createRequest() 获取 ClientHttpRequest。如果存在RequestCallback则将请求体写入HttpOutputMessagebody中。

    1. ClientHttpRequestHttpRequest 多一个execute()方法
    2. HttpRequestHttpMessageHttpMethod()URI()
    3. HttpOutputMessageHttpMessageOutputStream getBody()
    4. HttpMessage 只有 headers()

    ClientHttpRequest -> HttpRequest,HttpOutputMessage -> HttpMessage

  2. 执行请求

    调用 ClientHttpRequest.execute() 方法执行HTTP请求,获取 ClientHttpResponse

    1. ClientHttpRequest 继承 HttpRequest ,比 HttpRequest 多一个execute()方法
    2. ClientHttpResponse 继承 HttpInputMessage ,比 HttpInputMessagecode()close() 方法。
    3. HttpInputMessageHttpMessage 多一个 getBody()方法

    ClientHttpResponse -> HttpInputMessage -> HttpMessage

  3. 处理响应

    调用 RestTemplate.handleResponse() 方法处理 ClientHttpResponse

    1. 根据 ResponseErrorHandler 处理 响应是否存在错误
    2. 根据 ResponseExtractor 处理 抽取响应体。
    3. 关闭 ClientHttpResponse

ClientHttpRequest

image.png

ClientHttpResponse

image.png