本文已参与「新人创作礼」活动,一起开启掘金创作之路。
RestTemplate
HttpAccessor
ClientHttpRequestFactory的setter/getter。默认是SimpleClientHttpRequestFactoryList<ClientHttpRequestInitializer> clientHttpRequestInitializers的 setter/getter。默认是空集合ClientHttpRequest的创建方法createRequest()。ClientHttpRequest的初始化方法initialize(),供createRequest()方法内部获取ClientHttpRequest之后对其初始化。
主要能力是通过HttpAccessor.createRequest()获取ClientHttpRequest对象。
InterceptingHttpAccessor
List<ClientHttpRequestInterceptor> interceptors的setter/getter。作为拦截器列表,setter的时候AnnotationAwareOrderComparator.sort()方法有序存储。ClientHttpRequestFactory interceptingRequestFactory的setter/getter。作为ClientHttpRequest的工厂。interceptingRequestFactorysetter时调用HttpAccessor.setter()方法,将interceptingRequestFactory设置为null。interceptingRequestFactorygetter时将HttpAccessor.ClientHttpRequestFactory与this.interceptors封装成InterceptingClientHttpRequestFactory返回。如果this.interceptors为空,返回setter时的ClientHttpRequestFactory。
RestOperations
Interface specifying a basic set of RESTful operations.
getForObject
postForObject
put
delete
patchForObject
exchange
execute:真正执行请求的方法。
RestTemplate
- 序列化配置
List<HttpMessageConverter<?>> messageConverters消息转换器集合ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler()响应错误处理器UriTemplateHandler uriTemplateHandlerRUI模版处理器,拼接uriVariables到URI,供doExecute()使用。构造函数内调用initUriTemplateHandler()函数初始化。ResponseExtractor<HttpHeaders> headersExtractor = new HeadersExtractor()响应头提取器。- get/post/put/delete/patch方法
exchange()execute()方法执行真正的请求逻辑。
execute()方法
多个重载,为doExecute()方法整理入参。调用doExecute()方法执行真正的请求逻辑。
doExecute() 方法
-
创建请求
调用
HttpAccessor.createRequest()获取ClientHttpRequest。如果存在RequestCallback则将请求体写入HttpOutputMessage的body中。ClientHttpRequest比HttpRequest多一个execute()方法HttpRequest比HttpMessage多HttpMethod()和URI()HttpOutputMessage比HttpMessage多OutputStream getBody()HttpMessage只有headers()
ClientHttpRequest -> HttpRequest,HttpOutputMessage -> HttpMessage
-
执行请求
调用
ClientHttpRequest.execute()方法执行HTTP请求,获取ClientHttpResponseClientHttpRequest继承HttpRequest,比HttpRequest多一个execute()方法ClientHttpResponse继承HttpInputMessage,比HttpInputMessage多code()和close()方法。HttpInputMessage比HttpMessage多一个getBody()方法
ClientHttpResponse -> HttpInputMessage -> HttpMessage
-
处理响应
调用
RestTemplate.handleResponse()方法处理ClientHttpResponse。- 根据
ResponseErrorHandler处理 响应是否存在错误 - 根据
ResponseExtractor处理 抽取响应体。 - 关闭
ClientHttpResponse。
- 根据