一、介紹
Spring的RestTemplate是一個強大的,流行的基于Java的REST客戶端。Spring for Android RestTemplate模塊提供了一個適用于Android環(huán)境的RestTemplate版本。
1.1、RestTemplate構(gòu)造函數(shù)
RestTemplate下面列出了四個構(gòu)造函數(shù)。默認構(gòu)造函數(shù)不包括任何消息體轉(zhuǎn)換器。使用默認構(gòu)造函數(shù)時,必須添加消息轉(zhuǎn)換器。如果你想以包括新的消息轉(zhuǎn)換器的默認設(shè)置RestTemplate情況下,那么你可以傳遞true的includeDefaultConverters參數(shù)。有關(guān)默認轉(zhuǎn)換器的列表,請參閱HTTP消息轉(zhuǎn)換部分。另外,如果你想指定一個不同的,ClientHttpRequestFactory那么你可以通過傳遞給參數(shù)來做到這requestFactory一點。
RestTemplate();
RestTemplate(boolean includeDefaultConverters);
RestTemplate(ClientHttpRequestFactory requestFactory);
RestTemplate(boolean includeDefaultConverters,ClientHttpRequestFactory requestFactory);
1.2、RestTemplate方法
RestTemplate提供對應(yīng)于六種主要HTTP方法中的每一種的更高級別的方法。這些方法可以方便地調(diào)用許多RESTful服務(wù)并執(zhí)行REST最佳實踐。
RestTemplate方法名稱遵循命名約定,第一部分指出正在調(diào)用什么HTTP方法,第二部分指出返回的內(nèi)容。例如,該方法getForObject()將執(zhí)行GET,將HTTP響應(yīng)轉(zhuǎn)換為您選擇的對象類型并返回該對象。該方法postForLocation()將執(zhí)行POST,將給定對象轉(zhuǎn)換為HTTP請求,并返回可以找到新創(chuàng)建的對象的響應(yīng)HTTP Location頭。在異常處理HTTP請求的情況下,RestClientException將拋出該類型的異常。這種行為可以通過插入另一個ResponseErrorHandler實現(xiàn)來改變RestTemplate.
1.2.3、HTTP DELETE
public void delete(String url, Object... urlVariables) throws RestClientException;
public void delete(String url, Map<String, ?> urlVariables) throws RestClientException;
public void delete(URI url) throws RestClientException;
1.2.4、HTTP GET
ublic <T> T getForObject(String url, Class<T> responseType, Object... urlVariables) throws RestClientException;
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> urlVariables) throws RestClientException;
public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException;
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... urlVariables);
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> urlVariables);
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException;
1.2.5、HTTP HEAD
public HttpHeaders headForHeaders(String url, Object... urlVariables) throws RestClientException;
public HttpHeaders headForHeaders(String url, Map<String, ?> urlVariables) throws RestClientException;
public HttpHeaders headForHeaders(URI url) throws RestClientException;
1.2.6、HTTP OPTIONS
public Set<HttpMethod> optionsForAllow(String url, Object... urlVariables) throws RestClientException;
public Set<HttpMethod> optionsForAllow(String url, Map<String, ?> urlVariables) throws RestClientException;
public Set<HttpMethod> optionsForAllow(URI url) throws RestClientException;
1.2.7、HTTP POST
public URI postForLocation(String url, Object request, Object... urlVariables) throws RestClientException;
public URI postForLocation(String url, Object request, Map<String, ?> urlVariables);
public URI postForLocation(URI url, Object request) throws RestClientException;
public <T> T postForObject(String url, Object request, Class<T> responseType, Object... uriVariables);
public <T> T postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables);
public <T> T postForObject(URI url, Object request, Class<T> responseType) throws RestClientException;
public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables);
public <T> ResponseEntity<T> postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
public <T> ResponseEntity<T> postForEntity(URI url, Object request, Class<T> responseType) throws RestClientException;
1.2.8、HTTP PUT
public void put(String url, Object request, Object... urlVariables) throws RestClientException;
public void put(String url, Object request, Map<String, ?> urlVariables) throws RestClientException;
public void put(String url, Object request, Map<String, ?> urlVariables) throws RestClientException;
1.31、默認消息轉(zhuǎn)換器
出于性能原因,默認RestTemplate構(gòu)造函數(shù)不會注冊任何消息轉(zhuǎn)換器。但是,如果傳遞true給替代構(gòu)造函數(shù),則會注冊主要MIME類型的轉(zhuǎn)換器。您也可以編寫自己的轉(zhuǎn)換器并通過messageConverters屬性注冊。
當使用備用RestTemplate構(gòu)造,與模板注冊的默認轉(zhuǎn)換器實例是ByteArrayHttpMessageConverter,StringHttpMessageConverter和ResourceHttpMessageConverter。如果您的應(yīng)用程序在Android 2.2上運行或更高版本,然后XmlAwareFormHttpMessageConverter和SourceHttpMessageConverter注冊,因為這兩個消息轉(zhuǎn)換器需要javax.xml.transform.Source。在Android 2.1中,這又回到FormHttpMessageConverter了其他兩個缺少一些XML支持的情況。
ByteArrayHttpMessageConverter 始終包含
StringHttpMessageConverter 始終包含
ResourceHttpMessageConverter 始終包含
SourceHttpMessageConverter 包括在Android 2.2(Froyo)或更新版本,哪里javax.xml.transform.Source可用。
XmlAwareFormHttpMessageConverter 包括在Android 2.2(Froyo)或更新版本,哪里javax.xml.transform.Source可用
FormHttpMessageConverter 包括在Android 2.1(Eclair)和更舊的。
SimpleXmlHttpMessageConverter 如果存在Simple XML序列化程序,則包括它。
MappingJackson2HttpMessageConverter 如果Jackson 2.x JSON處理器存在,則包括在內(nèi)。
MappingJacksonHttpMessageConverter 如果Jackson 1.x JSON處理器存在,則包括在內(nèi)。如果兩個版本都可用于類路徑,Jackson 2.x的支持優(yōu)先于Jackson 1.x。
SyndFeedHttpMessageConverter 如果Android ROME Feed閱讀器存在,則包含在內(nèi)。
1.3.2、
下面的HttpMessageConverter實現(xiàn)在春季為Android是可用的。對于所有轉(zhuǎn)換器,使用默認介質(zhì)類型,但可以通過supportedMediaTypes屬性覆蓋。
ByteArrayHttpMessageConverter
一個HttpMessageConverter可以從HTTP請求和響應(yīng)中讀取和寫入字節(jié)數(shù)組的實現(xiàn)。默認情況下,此轉(zhuǎn)換器支持所有媒體類型(/),并使用其中的一種Content-Type進行寫入application/octet-stream。這可以通過設(shè)置supportedMediaTypes屬性并覆蓋來覆蓋getContentType(byte[])。
FormHttpMessageConverter
一個HttpMessageConverter可以從HTTP請求和響應(yīng)中讀寫表單數(shù)據(jù)的實現(xiàn)。默認情況下,此轉(zhuǎn)換器讀取和寫入媒體類型application/x-www-form-urlencoded。表單數(shù)據(jù)從中讀取并寫入MultiValueMap<String, String>。
XmlAwareFormHttpMessageConverter
通過擴展FormHttpMessageConverter,添加對基于XML的零件的支持 SourceHttpMessageConverter
ResourceHttpMessageConverter
一個HttpMessageConverter可以讀寫Resource資源的實現(xiàn)。默認情況下,此轉(zhuǎn)換器可以讀取所有介質(zhì)類型。application/octet-stream用于Content-Type確定書面資源
SourceHttpMessageConverter
一個HttpMessageConverter可以javax.xml.transform.Source從HTTP請求和響應(yīng)中讀取和寫入的實現(xiàn)。只有DOMSource,SAXSource并StreamSource得到支持。默認情況下,此轉(zhuǎn)換器支持text/xml和application/xml。
StringHttpMessageConverter
一個HttpMessageConverter可以從HTTP請求和響應(yīng)中讀取和寫入Strings的實現(xiàn)。默認情況下,此轉(zhuǎn)換器支持所有文字媒體類型(text/*),并用寫Content-Type的text/plain。
SimpleXmlHttpMessageConverter
一個HttpMessageConverter可以讀取和寫入使用從HTTP請求XML和響應(yīng)實現(xiàn)簡單的框架的Serializer??梢愿鶕?jù)需要通過使用Simple提供的注釋來定制XML映射。當需要額外的控制時,Serializer可以通過Serializer屬性注入自定義。默認情況下,該轉(zhuǎn)換器讀取和寫入的介質(zhì)類型application/xml,text/xml和application/*+xml。
重要的是要注意,這不是Spring OXM兼容的消息轉(zhuǎn)換器。它是通過Spring for Android啟用XML序列化的獨立實現(xiàn)。
將以下依賴關(guān)系添加到您的類路徑中以啟用SimpleXmlHttpMessageConverter。
<dependency>
<groupId> org.simpleframework </ groupId>
<artifactId> simple-xml </ artifactId>
<version> $ {simple-version} </ version>
</ dependency>
MappingJackson2HttpMessageConverter
一個HttpMessageConverter可以讀取和寫入使用JSON實施杰克遜(2.X)的ObjectMapper。可以根據(jù)需要通過使用Jackson提供的注釋來定制JSON映射。當需要進一步控制時,ObjectMapper可以通過ObjectMapper屬性注入自定義,以便需要為特定類型提供自定義的JSON序列化器/解串器。默認情況下,此轉(zhuǎn)換器支持application/json。
請注意,此消息轉(zhuǎn)換器和默認情況下GsonHttpMessageConverter都支持application/json。因此,您只應(yīng)該向RestTemplate實例添加一個JSON消息轉(zhuǎn)換器。RestTemplate將使用它找到的第一個轉(zhuǎn)換器匹配指定的MIME類型,因此包括兩者都可能產(chǎn)生意外的結(jié)果。
在您的類路徑中包含以下依賴項以啟用MappingJackson2HttpMessageConverter。請注意,如果手動將罐子復制到項目中,您還需要包括jackson-annotations和jackson-corejar。
<dependency>
<groupId> com.fasterxml.jackson.core </ groupId>
<artifactId> jackson-databind </ artifactId>
<version> $ {jackson-version} </ version>
</ dependency>
如果您更喜歡使用Jackson JSON處理器,那么請在您的類路徑中包含以下依賴項以啟用MappingJacksonHttpMessageConverter。請注意,如果手動將瓶子復制到項目中,您還需要包含該jackson-core-asljar。
<dependency>
<groupId> org.codehaus.jackson </ groupId>
<artifactId> jackson-mapper-asl </ artifactId>
<version> $ {jackson-version} </ version>
</ dependency>
GsonHttpMessageConverter
一個HttpMessageConverter可以讀取和寫入使用JSON實現(xiàn)谷歌GSON的Gson類??梢愿鶕?jù)需要通過使用Gson提供的注釋來定制JSON映射。當需要進一步控制時,Gson可以通過Gson屬性注入自定義,以便需要為特定類型提供自定義的JSON序列化器/解串器。默認情況下,此轉(zhuǎn)換器支持application/json。
請注意,此消息轉(zhuǎn)換器和默認情況下MappingJackson2HttpMessageConverter都支持application/json。因此,您只應(yīng)該向RestTemplate實例添加一個JSON消息轉(zhuǎn)換器。RestTemplate將使用它找到的第一個轉(zhuǎn)換器匹配指定的MIME類型,因此包括兩者都可能產(chǎn)生意外的結(jié)果。
在您的類路徑中包含以下依賴項以啟用GsonHttpMessageConverter。
<dependency>
<groupId> com.google.code.gson </ groupId>
<artifactId> gson </ artifactId>
<version> $ {gson-version} </ version>
</ dependency>
SyndFeedHttpMessageConverter
一個HttpMessageConverter可以使用Android ROME Feed Reader從HTTP請求和響應(yīng)中讀取和寫入RSS和Atom訂閱源的實現(xiàn)。數(shù)據(jù)被讀取并寫入com.google.code.rome.android.repackaged.com.sun.syndication.feed.synd.SyndFeed。默認情況下,此轉(zhuǎn)換器支持application/rss+xml和application/atom+xml。
添加下面的依賴到classpath啟用SyndFeedHttpMessageConverter,RssChannelHttpMessageConverter或AtomFeedHttpMessageConverter。該庫依賴于JDOM的分叉版本,可在Android 2.1及更早版本上運行。JDOM庫解決了Android XML解析器中的錯誤。
<dependency>
<groupId>com.google.code.android-rome-feed-reader</groupId>
<artifactId>android-rome-feed-reader</artifactId>
<version>${android-rome-version}</version>
</dependency>
<dependency>
<groupId> org.jdom </ groupId>
<artifactId> jdom </ artifactId>
<version> $ {jdom-fork-version} </ version>
</ dependency>
通過Maven Central無法使用Android ROME Feed閱讀器。使用Maven時,您需要在POM中包含以下存儲庫。
<! - 使用Android ROME Feed Reader開發(fā) - >
<repository>
<id> android-rome-feed-reader-repository </ id>
<name> Android ROME Feed閱讀器存儲庫</ name>
<url> https: //android-rome-feed-reader.googlecode.com/svn/maven2/releases </ url>
</ repository>
RssChannelHttpMessageConverter
一個HttpMessageConverter可讀寫RSS實現(xiàn)從使用HTTP請求和響應(yīng)飼料的Android ROME Feed閱讀器。數(shù)據(jù)被讀取并寫入com.google.code.rome.android.repackaged.com.sun.syndication.feed.rss.Channel。默認情況下,此轉(zhuǎn)換器支持application/rss+xml。
將SyndFeedHttpMessageConverter提供圍繞RSS更高的抽象水平和Atom提要中,RssChannelHttpMessageConverter當你創(chuàng)建一個新的不包括在消息轉(zhuǎn)換器的默認設(shè)置RestTemplate實例。如果您喜歡使用此消息轉(zhuǎn)換器,則必須手動將其添加到RestTemplate實例。
有關(guān)SyndFeedHttpMessageConverter所需的Android ROME Feed Reader依賴關(guān)系的信息,請參閱該部分。
AtomFeedHttpMessageConverter
一個HttpMessageConverter實現(xiàn),可以使用Android ROME Feed Reader從HTTP請求和響應(yīng)中讀取和寫入Atom訂閱源。數(shù)據(jù)被讀取并寫入com.google.code.rome.android.repackaged.com.sun.syndication.feed.atom.Feed。默認情況下,此轉(zhuǎn)換器支持application/atom+xml。
因為SyndFeedHttpMessageConverterRSS和Atom訂閱源提供了更高級別的抽象,所以AtomFeedHttpMessageConverter在創(chuàng)建新RestTemplate實例時,它不會包含在默認的消息轉(zhuǎn)換器集中。如果您更喜歡使用此消息轉(zhuǎn)換器,則必須手動將其添加到RestTemplate實例。
二、DEMO
1、基本配置
@LoadBalanced //使RestTemplate實現(xiàn)負載均衡
@Bean
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); //添加Jackson和String消息轉(zhuǎn)換器
restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); //進行HTTP POST請求,將請求封送到JSON,
return restTemplate;
}
1.1、基本用法
// Create and populate a simple object to be used in the request
Message message = new Message();
message.setId(555);
message.setSubject("test subject");
message.setText("test text");
// Set the Content-Type header
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(new MediaType("application","json"));
HttpEntity<Message> requestEntity = new HttpEntity<Message>(message, requestHeaders);
// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate();
// Add the Jackson and String message converters
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
// Make the HTTP POST request, marshaling the request to JSON, and the response to a String
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
String result = responseEntity.getBody();
二、spring cloud
1、重試失敗的請求
負載平衡RestTemplate可以配置為重試失敗的請求。默認情況下,該邏輯被禁用,您可以通過將Spring重試添加到應(yīng)用程序的類路徑來啟用它。負載均衡RestTemplate將符合與重試失敗請求相關(guān)的一些Ribbon配置值。如果要在類路徑中使用Spring重試來禁用重試邏輯,則可以設(shè)置spring.cloud.loadbalancer.retry.enabled=false。您可以使用的屬性是client.ribbon.MaxAutoRetries,client.ribbon.MaxAutoRetriesNextServer和client.ribbon.OkToRetryOnAllOperations。
如果您看到錯誤java.lang.IllegalArgumentException: Can not set org.springframework.web.client.RestTemplate field com.my.app.Foo.restTemplate to com.sun.proxy.$Proxy89,請嘗試注入RestOperations或設(shè)置spring.aop.proxyTargetClass=true。