spring cloud RestTemplate

2017-05-10  本文已影响0人  汪梓文

一、介绍
Spring的RestTemplate是一个强大的,流行的基于Java的REST客户端。Spring for Android RestTemplate模块提供了一个适用于Android环境的RestTemplate版本。

1.1、RestTemplate构造函数
RestTemplate下面列出了四个构造函数。默认构造函数不包括任何消息体转换器。使用默认构造函数时,必须添加消息转换器。如果你想以包括新的消息转换器的默认设置RestTemplate情况下,那么你可以传递true的includeDefaultConverters参数。有关默认转换器的列表,请参阅HTTP消息转换部分。另外,如果你想指定一个不同的,ClientHttpRequestFactory那么你可以通过传递给参数来做到这requestFactory一点。

RestTemplate(); 

RestTemplate(boolean includeDefaultConverters); 

RestTemplate(ClientHttpRequestFactory requestFactory); 

RestTemplate(boolean includeDefaultConverters,ClientHttpRequestFactory requestFactory);

1.2、RestTemplate方法
RestTemplate提供对应于六种主要HTTP方法中的每一种的更高级别的方法。这些方法可以方便地调用许多RESTful服务并执行REST最佳实践。

RestTemplate方法名称遵循命名约定,第一部分指出正在调用什么HTTP方法,第二部分指出返回的内容。例如,该方法getForObject()将执行GET,将HTTP响应转换为您选择的对象类型并返回该对象。该方法postForLocation()将执行POST,将给定对象转换为HTTP请求,并返回可以找到新创建的对象的响应HTTP Location头。在异常处理HTTP请求的情况下,RestClientException将抛出该类型的异常。这种行为可以通过插入另一个ResponseErrorHandler实现来改变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、默认消息转换器
出于性能原因,默认RestTemplate构造函数不会注册任何消息转换器。但是,如果传递true给替代构造函数,则会注册主要MIME类型的转换器。您也可以编写自己的转换器并通过messageConverters属性注册。

当使用备用RestTemplate构造,与模板注册的默认转换器实例是ByteArrayHttpMessageConverter,StringHttpMessageConverter和ResourceHttpMessageConverter。如果您的应用程序在Android 2.2上运行或更高版本,然后XmlAwareFormHttpMessageConverter和SourceHttpMessageConverter注册,因为这两个消息转换器需要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处理器存在,则包括在内。
MappingJacksonHttpMessageConverter  如果Jackson 1.x JSON处理器存在,则包括在内。如果两个版本都可用于类路径,Jackson 2.x的支持优先于Jackson 1.x。
SyndFeedHttpMessageConverter    如果Android ROME Feed阅读器存在,则包含在内。

1.3.2、
下面的HttpMessageConverter实现在春季为Android是可用的。对于所有转换器,使用默认介质类型,但可以通过supportedMediaTypes属性覆盖。

ByteArrayHttpMessageConverter

一个HttpMessageConverter可以从HTTP请求和响应中读取和写入字节数组的实现。默认情况下,此转换器支持所有媒体类型(/),并使用其中的一种Content-Type进行写入application/octet-stream。这可以通过设置supportedMediaTypes属性并覆盖来覆盖getContentType(byte[])。

FormHttpMessageConverter

一个HttpMessageConverter可以从HTTP请求和响应中读写表单数据的实现。默认情况下,此转换器读取和写入媒体类型application/x-www-form-urlencoded。表单数据从中读取并写入MultiValueMap<String, String>。

XmlAwareFormHttpMessageConverter

通过扩展FormHttpMessageConverter,添加对基于XML的零件的支持 SourceHttpMessageConverter

ResourceHttpMessageConverter

一个HttpMessageConverter可以读写Resource资源的实现。默认情况下,此转换器可以读取所有介质类型。application/octet-stream用于Content-Type确定书面资源

SourceHttpMessageConverter

一个HttpMessageConverter可以javax.xml.transform.Source从HTTP请求和响应中读取和写入的实现。只有DOMSource,SAXSource并StreamSource得到支持。默认情况下,此转换器支持text/xml和application/xml。

StringHttpMessageConverter

一个HttpMessageConverter可以从HTTP请求和响应中读取和写入Strings的实现。默认情况下,此转换器支持所有文字媒体类型(text/*),并用写Content-Type的text/plain。

SimpleXmlHttpMessageConverter

一个HttpMessageConverter可以读取和写入使用从HTTP请求XML和响应实现简单的框架的Serializer。可以根据需要通过使用Simple提供的注释来定制XML映射。当需要额外的控制时,Serializer可以通过Serializer属性注入自定义。默认情况下,该转换器读取和写入的介质类型application/xml,text/xml和application/*+xml。

重要的是要注意,这不是Spring OXM兼容的消息转换器。它是通过Spring for Android启用XML序列化的独立实现。

将以下依赖关系添加到您的类路径中以启用SimpleXmlHttpMessageConverter。

<dependency> 
    <groupId> org.simpleframework </ groupId> 
    <artifactId> simple-xml </ artifactId> 
    <version> $ {simple-version} </ version> 
</ dependency>

MappingJackson2HttpMessageConverter

一个HttpMessageConverter可以读取和写入使用JSON实施杰克逊(2.X)的ObjectMapper。可以根据需要通过使用Jackson提供的注释来定制JSON映射。当需要进一步控制时,ObjectMapper可以通过ObjectMapper属性注入自定义,以便需要为特定类型提供自定义的JSON序列化器/解串器。默认情况下,此转换器支持application/json。

请注意,此消息转换器和默认情况下GsonHttpMessageConverter都支持application/json。因此,您只应该向RestTemplate实例添加一个JSON消息转换器。RestTemplate将使用它找到的第一个转换器匹配指定的MIME类型,因此包括两者都可能产生意外的结果。

在您的类路径中包含以下依赖项以启用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实现谷歌GSON的Gson类。可以根据需要通过使用Gson提供的注释来定制JSON映射。当需要进一步控制时,Gson可以通过Gson属性注入自定义,以便需要为特定类型提供自定义的JSON序列化器/解串器。默认情况下,此转换器支持application/json。

请注意,此消息转换器和默认情况下MappingJackson2HttpMessageConverter都支持application/json。因此,您只应该向RestTemplate实例添加一个JSON消息转换器。RestTemplate将使用它找到的第一个转换器匹配指定的MIME类型,因此包括两者都可能产生意外的结果。

在您的类路径中包含以下依赖项以启用GsonHttpMessageConverter。

<dependency> 
    <groupId> com.google.code.gson </ groupId> 
    <artifactId> gson </ artifactId> 
    <version> $ {gson-version} </ version> 
</ dependency>

SyndFeedHttpMessageConverter

一个HttpMessageConverter可以使用Android ROME Feed Reader从HTTP请求和响应中读取和写入RSS和Atom订阅源的实现。数据被读取并写入com.google.code.rome.android.repackaged.com.sun.syndication.feed.synd.SyndFeed。默认情况下,此转换器支持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开发 - > 
<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实现从使用HTTP请求和响应饲料的Android ROME Feed阅读器。数据被读取并写入com.google.code.rome.android.repackaged.com.sun.syndication.feed.rss.Channel。默认情况下,此转换器支持application/rss+xml。

将SyndFeedHttpMessageConverter提供围绕RSS更高的抽象水平和Atom提要中,RssChannelHttpMessageConverter当你创建一个新的不包括在消息转换器的默认设置RestTemplate实例。如果您喜欢使用此消息转换器,则必须手动将其添加到RestTemplate实例。

有关SyndFeedHttpMessageConverter所需的Android ROME Feed Reader依赖关系的信息,请参阅该部分。

AtomFeedHttpMessageConverter

一个HttpMessageConverter实现,可以使用Android ROME Feed Reader从HTTP请求和响应中读取和写入Atom订阅源。数据被读取并写入com.google.code.rome.android.repackaged.com.sun.syndication.feed.atom.Feed。默认情况下,此转换器支持application/atom+xml。

因为SyndFeedHttpMessageConverterRSS和Atom订阅源提供了更高级别的抽象,所以AtomFeedHttpMessageConverter在创建新RestTemplate实例时,它不会包含在默认的消息转换器集中。如果您更喜欢使用此消息转换器,则必须手动将其添加到RestTemplate实例。

二、DEMO

1、基本配置

@LoadBalanced //使RestTemplate实现负载均衡
@Bean
public RestTemplate restTemplate(){
   RestTemplate restTemplate = new RestTemplate();
   restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); //添加Jackson和String消息转换器 
   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重试添加到应用程序的类路径来启用它。负载均衡RestTemplate将符合与重试失败请求相关的一些Ribbon配置值。如果要在类路径中使用Spring重试来禁用重试逻辑,则可以设置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或设置spring.aop.proxyTargetClass=true。

上一篇下一篇

猜你喜欢

热点阅读