環境搭建
本文環境指的 Spring Boot下1.4.2版本下
pom.xml (核心內容)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
如果單純想用RestTemplate 引上面的應該是多餘了,博主沒去查閱具體那個包,可以自行去Maven 中央倉庫搜索有沒有專門的RestTemplate包
RestTemplate有簡寫方法,但不具備通用性且無法做細節設置故本文不再贅述
舉例:
restTemplate.getForObject(url, String.class);
// 向url發送 Get類型請求,將返回結果 以String類型顯示
// 能很明顯發現無法設置編碼格式等,亂碼等問題無法解決
1
2
3
有興趣可訪問,下文只提通用性方法
RestTemplate 官方 API
注意
默認的 RestTemplate 有個機制是請求狀態碼非200 就拋出異常,會中斷接下來的操作,如果要排除這個問題那麼需要覆蓋默認的 ResponseErrorHandler ,下面爲用什麼也不幹覆蓋默認處理機制
RestTemplate restTemplate = new RestTemplate();
ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
return true;
}
@Override
public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {
}
};
restTemplate.setErrorHandler(responseErrorHandler);
1
2
3
4
5
6
7
8
9
10
11
12
13
實例
application/json類型請求
RestTemplate restTemplate=new RestTemplate();
String url="http://www.testXXX.com";
/* 注意:必須 http、https……開頭,不然報錯,瀏覽器地址欄不加 http 之類不出錯是因爲瀏覽器自動幫你補全了 */
HttpHeaders headers = new HttpHeaders();
/* 這個對象有add()方法,可往請求頭存入信息 */
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
/* 解決中文亂碼的關鍵 , 還有更深層次的問題 關係到 StringHttpMessageConverter,先佔位,以後補全*/
HttpEntity<String> entity = new HttpEntity<String>(body, headers);
/* body是Http消息體例如json串 */
restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
/*上面這句返回的是往 url發送 post請求 請求攜帶信息爲entity時返回的結果信息
String.class 是可以修改的,其實本質上就是在指定反序列化對象類型,這取決於你要怎麼解析請求返回的參數*/
1
2
3
4
5
6
7
8
9
10
11
12
另post、get、delete……等其他http請求類型只需將exchange參數修改爲HttpMethod.GET 等等。
application/x-www-form-urlencoded類型請求
RestTemplate restTemplate=new RestTemplate();
/* 注意:必須 http、https……開頭,不然報錯,瀏覽器地址欄不加 http 之類不出錯是因爲瀏覽器自動幫你補全了 */
String url="http://www.testXXX.com";
String bodyValTemplate = "var1=" + URLEncoder.encode("測試數據1", "utf-8") + "&var2=" + URLEncoder.encode("test var2", "utf-8");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity entity = new HttpEntity(bodyValTemplate, headers);
restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
1
2
3
4
5
6
7
8
9
另一種構造 HttpEntity 的方法
LinkedMultiValueMap body=new LinkedMultiValueMap();
body.add("var1","測試數據1");
body.add("var2","test Val2");
HttpEntity entity = new HttpEntity(body, headers);
1
2
3
4
上方請求在PostMan裏等效於圖
RestTemplate還有專門支持異步請求的特殊類 AsyncRestTemplate,具體用法和RestTemplate類似(需要 ListenableFutureCallback 基礎)
---------------------
作者:SolidCocoi
來源:CSDN
原文:https://blog.csdn.net/u014430366/article/details/65633679?utm_source=copy
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!