spring cloud RestTemplate

一、介绍
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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,368评论 6 343
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,619评论 4 59
  • 下午去给闺女开了家长会,是填报志愿的细则问题。晚上回到家就快很晚了。吃了饭后,跟儿子说:“子屹,你把作业先拿出来,...
    知足常乐_3afa阅读 157评论 0 0