您好,登錄后才能下訂單哦!
基本概念
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接口主要提供了兩種實現方式:
RestTemplate默認是使用SimpleClientHttpRequestFactory,內部是調用jdk的HttpConnection,默認超時為-1,我們可以自己定義超時時間
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); //設置連接超時,單位毫秒 factory.setConnectTimeout(5000); //設置讀取超時,單位毫秒 factory.setReadTimeout(10000); RestTemplate restTemplate = new RestTemplate(factory);
使用GET請求:
String url = "http://localhost:80/mandy/login.json?account=123456&password=123456"; Result res = restTemplate.getForObject(url, Result.class);
RestTemplate源碼:
@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請求:
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源碼:
@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請求:
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源碼:
@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方法的參數列中只有下面幾種
@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 方法,如下
@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()方法獲取。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。