Spring框架中發送http請求--RestTemplate 轉

環境搭建

本文環境指的 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 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章