亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring的RestTemplata使用的具體方法

 更新時(shí)間:2018年01月30日 14:52:29   作者:快樂的小樂  
本篇文章主要介紹了Spring的RestTemplata使用的具體方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

基本概念

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

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

在使用中可以直接new一個(gè)RestTemplate對(duì)象,在我們創(chuàng)建的RestTemplate對(duì)象中會(huì)有一些返回消息的消息轉(zhuǎn)換器,可以根據(jù)返回?cái)?shù)據(jù)的 MediaType 尋找對(duì)應(yīng)的轉(zhuǎn)換器并進(jìn)行 MediaType 轉(zhuǎn)換。自己也可以創(chuàng)建消息轉(zhuǎn)換器,創(chuàng)建一個(gè)類繼承AbstractGenericHttpMessageConverter<T>類或者實(shí)現(xiàn)HttpMessageConverter<T>接口,需要注意的是canRead方法和canWrite方法最好自己做判斷,在writeInternal或write方法中將參數(shù)寫入到流,在readInternal或read方法中將返回結(jié)果從流的body中獲取并進(jìn)行類型映射。

RestTemplate對(duì)象在底層通過使用java.net包下的實(shí)現(xiàn)創(chuàng)建HTTP 請(qǐng)求,可以通過使用ClientHttpRequestFactory指定不同的HTTP請(qǐng)求方式。

ClientHttpRequestFactory接口主要提供了兩種實(shí)現(xiàn)方式:

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

RestTemplate默認(rèn)是使用SimpleClientHttpRequestFactory,內(nèi)部是調(diào)用jdk的HttpConnection,默認(rèn)超時(shí)為-1,我們可以自己定義超時(shí)時(shí)間

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//設(shè)置連接超時(shí),單位毫秒
factory.setConnectTimeout(5000);
//設(shè)置讀取超時(shí),單位毫秒
factory.setReadTimeout(10000);
RestTemplate restTemplate = new RestTemplate(factory);

使用GET請(qǐng)求:

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請(qǐng)求直接將參數(shù)拼接到地址上最好,不知道什么原因如果使用第三個(gè)參數(shù),即便是MultiValueMap類型也不行(網(wǎng)上有人說用MultiValueMap類型可以,我試了不行)

使用POST請(qǐng)求:

HashMap<String, Object> map = new HashMap<String, Object>();
 map.put("name", "測(cè)試");
 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();
 }
//創(chuàng)建HTTP頭部實(shí)體,填充頭部信息,比如數(shù)據(jù)格式
 HttpHeaders httpHeaders = new HttpHeaders();
 httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
//創(chuàng)建HTTP實(shí)體,可以直接利用構(gòu)造方法將請(qǐng)求體和請(qǐng)求頭放進(jìn)去
 HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr2, httpHeaders);
String url = "http://localhost:80/mandy/user_enable.json";
//調(diào)用方法進(jìn)行請(qǐng)求
 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請(qǐng)求:

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();
}
//創(chuàng)建HTTP頭部實(shí)體,填充頭部信息,比如數(shù)據(jù)格式
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
//創(chuàng)建HTTP實(shí)體,可以直接利用構(gòu)造方法將請(qǐng)求體和請(qǐng)求頭放進(jìn)去
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);
 }

這個(gè)方法有個(gè)小的缺點(diǎn)就是沒有請(qǐng)求結(jié)果的返回值,如果需要用到返回值,就不能用這個(gè)方法。

如果要使用delete類型的請(qǐng)求,RestTemplate的put方法的參數(shù)列中只有下面幾種

@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);
}

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

重點(diǎn): 其實(shí)我們可以直接使用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);
}

這里只列舉了一個(gè)方法,其他的可以看源碼,這個(gè)方法可以進(jìn)行所有類型的請(qǐng)求。

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn)

    SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn)

    Prometheus作為一個(gè)開源的監(jiān)控和告警工具,以其強(qiáng)大的數(shù)據(jù)采集、存儲(chǔ)和查詢能力,受到了眾多開發(fā)者的青睞,本文主要介紹了SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn),感興趣的可以了解一下
    2024-07-07
  • Java模版引擎Freemarker

    Java模版引擎Freemarker

    FreeMarker是一個(gè)模板引擎,一個(gè)基于模板生成文本輸出的通用工具,使用純Java編寫 FreeMarker被設(shè)計(jì)用來生成HTML Web頁面,特別是基于MVC模式的應(yīng)用程序
    2016-04-04
  • JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果(二)

    JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果(二)

    這篇文章主要為大家詳細(xì)介紹了JavaFX實(shí)現(xiàn)簡易時(shí)鐘效果的第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if)

    MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if)

    這篇文章主要介紹了MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 詳解Java中super的幾種用法并與this的區(qū)別

    詳解Java中super的幾種用法并與this的區(qū)別

    這篇文章主要介紹了Java中super的幾種用法并與this的區(qū)別,有需要的朋友可以參考一下
    2013-12-12
  • Java?垃圾回收超詳細(xì)講解記憶集和卡表

    Java?垃圾回收超詳細(xì)講解記憶集和卡表

    卡表就是記憶集的一種具體實(shí)現(xiàn),它定義了記憶集的記錄精度、與堆內(nèi)存的映射關(guān)系等。?關(guān)于卡表與記憶集的關(guān)系,不妨按照J(rèn)ava語言中HashMap與Map的關(guān)系來類比理解。記憶集是一種用于記錄從非收集區(qū)域指向收集區(qū)域的指針集合的抽象數(shù)據(jù)結(jié)構(gòu)
    2022-04-04
  • SpringBoot自動(dòng)配置源碼深入刨析講解

    SpringBoot自動(dòng)配置源碼深入刨析講解

    這篇文章主要介紹了SpringBoot自動(dòng)配置原理分析,SpringBoot是我們經(jīng)常使用的框架,那么你能不能針對(duì)SpringBoot實(shí)現(xiàn)自動(dòng)配置做一個(gè)詳細(xì)的介紹。如果可以的話,能不能畫一下實(shí)現(xiàn)自動(dòng)配置的流程圖。牽扯到哪些關(guān)鍵類,以及哪些關(guān)鍵點(diǎn)
    2022-09-09
  • 最新評(píng)論