一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - Spring的RestTemplata使用的具體方法

Spring的RestTemplata使用的具體方法

2021-03-29 10:13快樂的小樂 JAVA教程

本篇文章主要介紹了Spring的RestTemplata使用的具體方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

基本概念

Spring RestTemplate 是 Spring 提供的用于訪問 Rest 服務的客戶端,RestTemplate 提供了多種便捷訪問遠程Http服務的方法,能夠大大提高客戶端的編寫效率,所以很多客戶端比如 Android或者第三方服務商都是使用 RestTemplate 請求 restful 服務。

spring-web的RestTemplata是對java底層http的封裝,使用RestTemplata用戶可以不再關注底層的連接建立,并且RestTemplata不僅支持Rest規范,還可以定義返回值對象類型。

在使用中可以直接new一個RestTemplate對象,在我們創建的RestTemplate對象中會有一些返回消息的消息轉換器,可以根據返回數據的 MediaType 尋找對應的轉換器并進行 MediaType 轉換。自己也可以創建消息轉換器,創建一個類繼承AbstractGenericHttpMessageConverter<T>類或者實現HttpMessageConverter<T>接口,需要注意的是canRead方法和canWrite方法最好自己做判斷,在writeInternal或write方法中將參數寫入到流,在readInternal或read方法中將返回結果從流的body中獲取并進行類型映射。

RestTemplate對象在底層通過使用java.net包下的實現創建HTTP 請求,可以通過使用ClientHttpRequestFactory指定不同的HTTP請求方式。

ClientHttpRequestFactory接口主要提供了兩種實現方式:

  1. 一種是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)創建底層的Http請求連接。
  2. 一種方式是使用HttpComponentsClientHttpRequestFactory方式,底層使用HttpClient訪問遠程的Http服務,使用HttpClient可以配置連接池和證書等信息。

RestTemplate默認是使用SimpleClientHttpRequestFactory,內部是調用jdk的HttpConnection,默認超時為-1,我們可以自己定義超時時間

?
1
2
3
4
5
6
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//設置連接超時,單位毫秒
factory.setConnectTimeout(5000);
//設置讀取超時,單位毫秒
factory.setReadTimeout(10000);
RestTemplate restTemplate = new RestTemplate(factory);

使用GET請求:

?
1
2
String url = "http://localhost:80/mandy/login.json?account=123456&password=123456";
Result res = restTemplate.getForObject(url, Result.class);

RestTemplate源碼:

?
1
2
3
4
5
6
7
 @Override
public <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException {
 RequestCallback requestCallback = acceptHeaderRequestCallback(responseType);
 HttpMessageConverterExtractor<T> responseExtractor =
   new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
 return execute(url, HttpMethod.GET, requestCallback, responseExtractor, urlVariables);
}

使用get請求直接將參數拼接到地址上最好,不知道什么原因如果使用第三個參數,即便是MultiValueMap類型也不行(網上有人說用MultiValueMap類型可以,我試了不行)

使用POST請求:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HashMap<String, Object> map = new HashMap<String, Object>();
 map.put("name", "測試");
 map.put("account", "qwer");
 map.put("password", "qwer");
 ObjectMapper mapper = new ObjectMapper();
 String jsonStr = null;
 try {
   jsonStr = mapper.writeValueAsString(map);
 } catch (Exception e) {
   e.printStackTrace();
 }
//創建HTTP頭部實體,填充頭部信息,比如數據格式
 HttpHeaders httpHeaders = new HttpHeaders();
 httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
//創建HTTP實體,可以直接利用構造方法將請求體和請求頭放進去
 HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr2, httpHeaders);
String url = "http://localhost:80/mandy/user_enable.json";
//調用方法進行請求
 Result res2 = restTemplate.postForObject(url, httpEntity, Result.class);

RestTemplate源碼:

?
1
2
3
4
5
6
7
8
9
 @Override
public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
  throws RestClientException {
 
 RequestCallback requestCallback = httpEntityCallback(request, responseType);
 HttpMessageConverterExtractor<T> responseExtractor =
   new HttpMessageConverterExtractor<T>(responseType, getMessageConverters(), logger);
 return execute(url, HttpMethod.POST, requestCallback, responseExtractor, uriVariables);
}

使用PUT請求:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("user_id", "1");
map.put("enable", 0);
ObjectMapper mapper = new ObjectMapper();
String jsonStr = null;
try {
 jsonStr = mapper.writeValueAsString(map);
} catch (JsonProcessingException e) {
 e.printStackTrace();
}
//創建HTTP頭部實體,填充頭部信息,比如數據格式
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
//創建HTTP實體,可以直接利用構造方法將請求體和請求頭放進去
HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr, httpHeaders); 
String url = "http://localhost:80/mandy/user_enable.json";
restTemplate.put(url , httpEntity);

RestTemplate源碼:

?
1
2
3
4
5
 @Override
public void put(String url, Object request, Object... urlVariables) throws RestClientException {
 RequestCallback requestCallback = httpEntityCallback(request);
 execute(url, HttpMethod.PUT, requestCallback, null, urlVariables);
}

這個方法有個小的缺點就是沒有請求結果的返回值,如果需要用到返回值,就不能用這個方法。

如果要使用delete類型的請求,RestTemplate的put方法的參數列中只有下面幾種

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void delete(String url, Object... urlVariables) throws RestClientException {
  execute(url, HttpMethod.DELETE, null, null, urlVariables);
}
 
@Override
public void delete(String url, Map<String, ?> urlVariables) throws RestClientException {
  execute(url, HttpMethod.DELETE, null, null, urlVariables);
}
 
@Override
public void delete(URI url) throws RestClientException {
  execute(url, HttpMethod.DELETE, null, null);
}

這些方法并沒有給我們參數讓我們放請求體內容,所以如果要直接使用RestTemplate提供的Delete方法,接口必須使用restful風格,將參數放在地址中,通過@PathVariable(value="")注解將參數獲取到。

重點: 其實我們可以直接使用RestTemplate的 exchange 方法,如下

?
1
2
3
4
5
6
7
8
@Override
public <T> ResponseEntity<T> exchange(String url, HttpMethod method,
  HttpEntity<?> requestEntity, Class<T> responseType, Object... uriVariables) throws RestClientException {
 
  RequestCallback requestCallback = httpEntityCallback(requestEntity, responseType);
  ResponseExtractor<ResponseEntity<T>> responseExtractor = responseEntityExtractor(responseType);
  return execute(url, method, requestCallback, responseExtractor, uriVariables);
}

這里只列舉了一個方法,其他的可以看源碼,這個方法可以進行所有類型的請求。

在這個方法中,method參數可以通過HTTPMethod枚舉來進行獲取,requestEntity參數是自己封裝的HttpEntity實體,包含請求體和請求頭,responseType參數是返回結果的映射類,uriVariables這個參數給我的印象就是雞肋(個人看法),獲取請求返回接口可以通過方法返回值的getBody()方法獲取。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/zzw-blog/p/8360512.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本不卡在线一区二区三区视频 | 十大看黄网站 | 色yeye在线观看 | 国产91精品在线播放 | 黑人操日本妞 | 免费看男人狂躁女人 | 91动漫在线观看 | 欧美视频网址 | 无人在线高清观看 | 国产1区2区三区不卡 | 色哟哟国产成人精品 | 五月天色网站 | 免费一级毛片在线播放 | 国产精品亚欧美一区二区三区 | 亚洲国产一区二区三区a毛片 | 好男人资源免费播放 | 男女羞羞的视频 | 青青青青久久国产片免费精品 | 91精品国产色综合久久不卡蜜 | 污丝瓜视频 | 国产成人精品午夜视频' | 天天综合网天天做天天受 | 污污动图| 俺来操| 91精品国产91久久久久久 | chinesespanking网站| 成人国产精品视频 | 成全视频在线观看免费 | 十大免费批日的软件 | 91制片厂制作传媒网站破解 | ssni-497新任美脚女教师 | 色99在线| xxx88视频在线观看 | 亚洲欧美成人综合 | 男人操女人免费视频 | 国内精品 大秀视频 日韩精品 | 调教老师肉色丝袜的故事 | 插入粉嫩| 双性总裁(h)| 免费看男人使劲躁女人小说 | 蜜桃视频在线观看官网 |