背景
首次接觸到 RestTemplate,是在SpringCloud的項目中。模塊之間的調用走http協議,形式上有兩種寫法,其中一種是通過RestTemplate調用微服務其他模塊的接口,另一種方式是推薦的更加簡潔的使用feign相關的註解
這個 RestTemplate 其實可以替代很多http的工具,常見的有okHttp,httpComponent(httpclient),JDK自帶的java.net.HttpURLConnection
使用
類依賴jar包,來自 spring-boot-starter-web 中的 org.springframework:spring-web
- 要使用先new,比如直接
RestTemplate restTemplate = new RestTemplate()
後即可使用 - 或者使用 @Bean,複用這個。RestTemplate 是線程安全的。
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
進階使用以及設置請求的具體實現
所謂 “請求的具體實現” 是指RestTemplate的具體的實現方式可以是JDK自帶的java.net.HttpURLConnection,也可以是apache的HTTPComponents,還可以是OkHttp。
默認情況下是JDK的實現,用於處理髮出的http請求。如何修改?
看下面的例子,設置requestfactory即可
package com.wyf.test.resttemplatetest.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;
/**
* RestTemplate 的配置類
*
* @author Stone
* @version V1.0.0
* @date 2019/12/16
*/
@Configuration
public class RestTemplateConfig {
/**
* 【版本1】不建議使用這個
* 1、readTimeout和connectTimeout默認都不超時
* 2、處理請求的底層類是:java.net.HttpURLConnection
*
* @return
*/
@Primary
@Bean("restTemplate")
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
return setStingHttpMessageConverterEncoding(restTemplate);
}
/**
* 【版本2】
* 1、設置了超時時間(當然也可以設置永不超時,setReadTimeout=0則永不超時)
* 2、設置了處理請求的底層類(java.net.HttpURLConnection、HTTPComponents、OkHttp)
*
* @return
*/
@Bean("restTemplateWithConfig")
public RestTemplate restTemplateWithConfig() {
// 要用哪個具體實現就設置哪個ClientHttpRequestFactory
// JDK的java.net.HttpURLConnection(直接new RestTemplate() 默認的實現方式)
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(5000);
// Http Client(Http Component),必須導入對應GAV
// HttpComponentsClientHttpRequestFactory factory2 = new HttpComponentsClientHttpRequestFactory();
// factory2.setConnectTimeout(15000);
// factory2.setReadTimeout(5000);
// OKHttp3,必須導入對應GAV
// OkHttp3ClientHttpRequestFactory factory3 = new OkHttp3ClientHttpRequestFactory();
// factory3.setConnectTimeout(15000);
// factory3.setReadTimeout(5000);
RestTemplate restTemplateWithConfig = new RestTemplate(factory);
return setStingHttpMessageConverterEncoding(restTemplateWithConfig);
}
/**
* 設置 StringHttpMessageConverter 爲 UTF-8編碼
*
* @param restTemplate
* @return
*/
private RestTemplate setStingHttpMessageConverterEncoding(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
if (converterList != null) {
Iterator<HttpMessageConverter<?>> itr = converterList.iterator();
while (itr.hasNext()) {
HttpMessageConverter<?> httpMessageConverter = itr.next();
if (httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
}
}
}
return restTemplate;
}
}