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

環境搭建web

本文環境指的 Spring Boot下1.4.2版本下 
pom.xml (核心內容)spring

 <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包json

RestTemplate有簡寫方法,但不具有通用性且沒法作細節設置故本文再也不贅述 
舉例:瀏覽器

restTemplate.getForObject(url, String.class);
// 向url發送 Get類型請求,將返回結果 以String類型顯示
// 能很明顯發現沒法設置編碼格式等,亂碼等問題沒法解決
1
2
3
有興趣可訪問,下文只提通用性方法 
RestTemplate 官方 APIapp

注意異步

默認的 RestTemplate 有個機制是請求狀態碼非200 就拋出異常,會中斷接下來的操做,若是要排除這個問題那麼須要覆蓋默認的 ResponseErrorHandler ,下面爲用什麼也不幹覆蓋默認處理機制ide

        RestTemplate restTemplate = new RestTemplate();
        ResponseErrorHandler responseErrorHandler = new ResponseErrorHandler() {
            @Override
            public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
                return true;
            }spring-boot

            @Override
            public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {post

            }
        };
        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  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索