天天看點

spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

在服務調用時候spring-web已經為我們封裝好了2個client模闆:

  • 同步調用的 RestTemplate
  • 支援異步調用的AsyncRestTemplate

本文簡單概述這2種模版的使用方式, 涉及相關細節後面的文章逐漸講解

RestTemplate描述

首先來開RestTemplate ,先看一下這個類的關系圖1-1

spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

圖1-1

從中可以看到RestTemplate 開放出來可供使用者操作的一些操作口子

  1. requestFactory:  這個是用于建立request的工廠. 預設為SimpleClientHttpRequestFactory(); 
               
  2. interceptors:這個是在送出請求前個使用者一個可以切入操作的地方. 預設為空
               
  3. messageConverters: 在post請求和resp回來時對資料的處理轉化; 對messageConverter的選擇是基于請求header中的Content-Type
               
  4. errorHandler: 處理失敗的handler.
               

RestTemplate請求處理

RestTemplate中提供了GET/POST/HEAD/PUT/PATCH/DELETE 方法(差別建wiki), 但最後都彙聚到doExecute這個方法

protected <T> T doExecute(URI url, HttpMethod method, RequestCallback requestCallback,
			ResponseExtractor<T> responseExtractor) throws RestClientException {

		.......
			ClientHttpRequest request = createRequest(url, method); //1.擷取request
			if (requestCallback != null) {
				requestCallback.doWithRequest(request);         //2.處理request
			}
			response = request.execute();                           //3.執行
			handleResponse(url, method, response);                  //4.錯誤處理
			if (responseExtractor != null) {    
				return responseExtractor.extractData(response); //5.解析response
			}
			else {
				return null;
			}
		........
	}
           
  1. 擷取request: 是通過 
    requestFactory.createRequest(url, method), 下圖(1-2,1-3)為spring-web提供的factory 和對應建立ClientHttpRequest類圖;選擇很多看具體業務需求
               
  2. 處理request: 根據requestCallback 類型 
    AcceptHeaderRequestCallback: 對于GET請求使用B隻處理header中的Accept類型
    HttpEntityRequestCallback(繼承AcceptHeaderRequestCallback): 對于其他請求使用A處理設定header, 還要對請求資料進行convert處理
               
  3. 執行: 使用上面建立的具體ClientHttpRequest對伺服器請求----這個地方以後展開細說
  4. 錯誤處理: 如果傳回的http code是4xx或者5xx時, 會使用errorHandler進行處理
  5. 解析response: 有3種實作
    HeadersExtractor 對HEAD請求傳回的resp處理提取需要的header
    ResponseEntityResponseExtractor 傳回ResponseEntity
    HttpMessageConverterExtractor 根據responseType選擇需要messageConverter把http傳回封包轉化為預定義的類型
               
spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

圖1-2

spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

圖1-3

AsyncRestTemplate描述

spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

圖1-4

和同步的Template類似,但AsyncRestTemplate中持有一個RestTemplate的執行個體,在構造方法中建立的. AsyncRestTemplate将messageConvert相關的處理委托給RestTemplate處理(包括請求封包和傳回封包)

AsyncRestTemplate處理

提供請求處理的方法也是類似的,隻不過調用後會立即傳回一個ResponseExtractorFuture, 使用者需要為ResponseExtractorFuture添加必須的callback,

void addCallback(ListenableFutureCallback<? super T> callback); 
和
void addCallback(SuccessCallback<? super T> successCallback, FailureCallback failureCallback);
           

當請求傳回時會觸發使用者的callback進行相應處理.

doExecute關鍵代碼如下:

AsyncClientHttpRequest request = createAsyncRequest(url, method);    //1.建立request
			if (requestCallback != null) {    
				requestCallback.doWithRequest(request);            //2.request處理
			}
ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync();     //3.執行
return new ResponseExtractorFuture<T>(method, url, responseFuture, responseExtractor);    //4.傳回
           
  1. 建立request: 是通過 
    requestFactory.createAsyncRequest(url, method) 下圖(1-5,1-6)為spring-web提供的異步AsyncRequestFactory 和對應建立AsyncClientHttpRequest類圖;選擇很多看具體業務需求
               
  2. 處理request: 委托RestTemplate處理, 同RestTemplate的處理邏輯
  3. 執行: AsyncClientHttpRequest的具體實作類進行處理, 傳回future
  4. 包裝成ResponseExtractorFuture傳回
spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

圖1-5

這些factory大部分都同時實作同步和異步接口,

spring-web restful http client之:(一)模版RestTemplate/AsyncRestTemplate

圖1-5

這個裡面Netty4ClientHttpRequest是同時實作同步和異步的request, 後面會對此詳細分析