1. 程式人生 > >Spring框架spring-web模組中的RestTemplate類詳解

Spring框架spring-web模組中的RestTemplate類詳解

RestTemplate類是spring-web模組中進行HTTP訪問的REST客戶端核心類。RestTemplate請求使用阻塞式IO,適合低併發的應用場景。

1. RestTemplate類提供了3個建構函式

  • RestTemplate()
  • RestTemplate(ClientHttpRequestFactory requestFactory)

org.springframework.http.client.ClientHttpRequestFactory介面的實現類給出底層實現的第三方HTTP客戶端軟體。

  • RestTemplate(java.util.List<HttpMessageConverter<?>> messageConverters)

org.springframework.http.converter.HttpMessageConverter介面的實現物件能夠在HTTP訊息與Java POJO之間進行資料轉換。
 

2. RestTemplate類能夠以多種HTTP的方法,如GET, POST, PUT, DELETE, HEAD, OPTIONS等,向伺服器發起HTTP請求。

2.1 GET請求的方法

  • getForObject(String, ResponseClass, Object[])
  • getForObject(String, ResponseClass, Map)
  • getForObject(URI, ResponseClass);

2.2 PUT請求的方法:

  • put(String, RequestClass, Object[])
  • put(String, RequestClass, Map)
  • put(URI, RequestClass);

2.3 POST請求的方法:

  • postForObject(String, RequestClass, ResonponseClass, Object[])
  • postForObject(String, RequestClass, ResonponseClass, Map)
  • postForObject(URI, RequestClass, ResonponseClass);

3. 在最新的Spring Framework 5.0.7.RELEASE中,spring-web模組底層採用的第三方HTTP客戶端軟體實現
3.1 Java HttpURLConnection (預設RestTemplate採用,不支援HTTP2)

SimpleClientHttpRequestFactory

3.2 Netty 4.1.25.Final

Netty4ClientHttpRequestFactory已經過時,被ReactorClientHttpConnector替代

3.3 OkHttp 3.10.0

OkHttp3ClientHttpRequestFactory

3.4 Apache HttpComponents (不支援HTTP2)

  • HttpClient 4.5.5

HttpComponentsClientHttpRequestFactory

  • HttpAsyncClient 4.1.3

HttpComponentsAsyncClientHttpRequestFactory已經過時

4. 示例

4.1 使用預設客戶端構造RestTemplate物件

RestTemplate restTemplate = new RestTemplate();

等價於

RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory());

等價於

RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());

4.2 使用OkHttp3構造RestTemplate物件

RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory());

4.3 使用RestTemplateBuilder構建引數化的RestTemplate物件

RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
restTemplateBuilder.build();

4.4 使用OkHttp3Client發出HTTPS請求

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory ssf = sslContext.getSocketFactory();

OkHttpClient httpClient = new OkHttpClient.Builder()
	.sslSocketFactory(ssf, (X509TrustManager) trustAllCerts[0])
	.hostnameVerifier(verifieredAllHost)
	.build();

OkHttp3ClientHttpRequestFactory requestFactory = 
     new OkHttp3ClientHttpRequestFactory(httpClient);
RestTemplate template = new RestTemplate(requestFactory);

5. 替代RestTemplate的響應式客戶端WebClient

在spring-webflux模組中,提供了響應式REST請求客戶端WebClient,用以替代RestTemplate。

org.springframework.web.reactive.function.client.WebClient介面使用非阻塞式IO,支援非同步呼叫,適合高併發、流式處理場景。

在該spring-webflux模組中,提供了一個WebClient預設實現org.springframework.web.reactive.function.client.DefaultWebClient類,後續我們再詳細介紹。
        

參考連結: