Spring Boot(13)——使用RestTemplate
使用RestTemplate
RestTemplate是Spring Web模块提供的作为客户端按照Rest规范进行Http请求的工具。Spring Boot也提供了对它的自动配置,Spring Boot不是直接的配置好RestTemplate对象,而是由org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
配置类自动配置一个org.springframework.boot.web.client.RestTemplateBuilder
对象,需要使用RestTemplate时可以注入RestTemplateBuilder对象,通过其build方法可以构建一个RestTemplate对象。比如下面的代码中SomeService会被扫描为一个Spring bean,其构造函数需要一个RestTemplateBuilder对象,Spring将自动为其注入该对象,在构造函数中通过注入的RestTemplateBuilder对象创建了一个RestTemplate对象,并把它保存起来,之后就可以在其它地方使用了,比如getSomething()
。
@Component public class SomeService { private final RestTemplate restTemplate; public SomeService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder.build(); } public String getSomething() { String content = this.restTemplate.getForObject("https://www.baidu.com", String.class); return content; } }
关于RestTemplate的用法可以参考http://elim.iteye.com/blog/2427553。
自定义配置
RestTemplateBuilder对象还提供了一系列的配置方法,可以方便的进行一些自定义,每个方法的调用都会返回一个全新的RestTemplateBuilder对象。所以在使用的时候可以放心的进行使用,而不必担心会影响到其它使用的地方。
配置HttpMessageConverter
可以通过messageConverters()
指定需要应用的HttpMessageConverter。
restTemplateBuilder.messageConverters(new StringHttpMessageConverter(Charset.forName("UTF-8"))); this.restTemplate = restTemplateBuilder.build();
上面的方式会是覆盖式的,可以应用additionalMessageConverters方法进行追加。
restTemplateBuilder.additionalMessageConverters(new StringHttpMessageConverter(Charset.forName("UTF-8"))); this.restTemplate = restTemplateBuilder.build();
另外,如果没有定义自己的org.springframework.boot.autoconfigure.http.HttpMessageConverters
bean,Spring Boot默认会在创建RestTemplateBuilder时应用bean容器中能发现的所有HttpMessageConverter类型的bean。所以如果我们有一个自定义的HttpMessageConverter需要应用到RestTemplate,只需要把它定义为Spring bean即可。
配置拦截器
RestTemplate其实还可以了一个ClientHttpRequestInterceptor接口,可以在发起请求前后对请求内容或响应内容进行拦截处理。可以实现自己的ClientHttpRequestInterceptor,然后通过interceptors()
进行应用。
restTemplateBuilder.interceptors(new TestInterceptor()); this.restTemplate = restTemplateBuilder.build();
上面的方式也是覆盖式的,可以通过additionalInterceptors()
进行追加。
restTemplateBuilder.additionalInterceptors(new TestInterceptor()); this.restTemplate = restTemplateBuilder.build();
Spring已经提供了一个用来进行Http Basic认证的拦截器,叫BasicAuthorizationInterceptor,它可以在每次请求的时候附加上需要用来认证的用户名和密码。
restTemplateBuilder.interceptors(new BasicAuthorizationInterceptor("username", "password")); this.restTemplate = restTemplateBuilder.build();
RestTemplateBuilder中提供了配置BasicAuthorizationInterceptor的简化方式,它开放了一个basicAuthorization()
。
restTemplateBuilder.basicAuthorization("username", "password"); this.restTemplate = restTemplateBuilder.build();
配置超时时间
可以通过setConnectTimeout()
指定建立连接超时时间,通过setReadTimeout()
指定获取响应结果的超时时间,单位都是毫秒。
restTemplateBuilder.setConnectTimeout(10 * 1000).setReadTimeout(20 * 1000); this.restTemplate = restTemplateBuilder.build();
更多配置信息可以参考RestTemplateBuilder的API文档。
ClientHttpRequestFactory
在非Spring Boot环境下使用RestTemplate时,默认的ClientHttpRequestFactory是基于JDK实现的SimpleClientHttpRequestFactory。Spring Boot中RestTemplateBuilder默认会检测Classpath路径下的ClientHttpRequestFactory实现,如果拥有Apache HttpComponents的org.apache.http.client.HttpClient
类则会使用org.springframework.http.client.HttpComponentsClientHttpRequestFactory
,拥有okhttp3.OkHttpClient
则会使用org.springframework.http.client.OkHttp3ClientHttpRequestFactory
。如果都没有则会使用基于JDK实现的SimpleClientHttpRequestFactory。可以通过detectRequestFactory(false)
关闭这种默认检测的机制。
restTemplateBuilder.detectRequestFactory(false);
可以通过requestFactory()
强制指定使用某个实现,下面的代码就配置了将强制使用一个进行了自定义的HttpComponentsClientHttpRequestFactory对象。它拥有一个重载的可以指定ClientHttpRequestFactory实现类的方法,使用该方法将采用指定实现类的默认配置。
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10*1000).setConnectionRequestTimeout(30*1000).build(); HttpClient httpClient = HttpClientBuilder.create().setMaxConnPerRoute(20).setMaxConnTotal(50).setDefaultRequestConfig(requestConfig).build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); restTemplateBuilder.requestFactory(() -> requestFactory);
通用的自定义配置
上面介绍的自定义配置都是基于某个RestTemplateBuilder进行的,一个应用中如果有多个地方需要使用RestTemplateBuilder构建RestTemplate时,如果某些自定义配置是通用的,每个地方都写一遍会比较麻烦。Spring Boot提供了一个RestTemplateBuilder接口,通过它可以对创建好的RestTemplate进行一些自定义配置。
@FunctionalInterface public interface RestTemplateCustomizer { /** * Callback to customize a {@link RestTemplate} instance. * @param restTemplate the template to customize */ void customize(RestTemplate restTemplate); }
Spring Boot在创建RestTemplateBuilder时,默认会把bean容器中定义的RestTemplateCustomizer都应用到RestTemplateBuilder中,也就是说如果需要对RestTemplate进行自定义,可以把自定义的RestTemplateCustomizer实现类定义为一个Spring bean。
(注:本文是基于Spring Boot 2.0.3所写)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C# Winform快速开发平台与软件配置平台
开发平台简介 开发平台是指以某种编程语言或者某几种编程语言为基础,开发出来的一个软件,而这软件不是一个最终的软件产品,它是一个二次开发软件框架,用户可以在这个产品上进行各种各样的软件产品的开发,并且在这个产品上进行开发的时候,不需要像以往的编程方式那样编写大量的代码,而是只需要进行一些简单的配置,或者是写极少量的代码便可以完成一个业务系统的开发工作。方便开发的工具,诸如Eclipse、JBuilder、VC++、Visual Stuido等等一系列的开发工具便出现在了市面上,这些工具的出现,大大方便了开发人员的编程工作和提高了设备运行的效率,减少了编程人员很多不必要的麻烦。 开发平台发展史 当我们最开始接触软件开发的时候,我们大都是采用记事本来编写程序,运用JDK、MFC等提供的API自己编写代码来完成想要的功能,编写完之后还要编译成可执行的文件,然后再运行。这种方式虽然通俗,但是一点也不方便,慢慢的,编程人员开始寻求比较方便开发的工具,于是诸如Eclipse、JBuilder、VC++、Visual Stuido等等一系列的开发工具便出现市面上,这些工具的出现,大大方便了开发人员的编...
- 下一篇
java中的四舍五入-银行家舍入法
java基础知识点总结: 从平时的阅读和工作中记录下容易忽略的琐碎的知识点,都是些基础的东西。 一、java中的四舍五入: 目前java支持7中舍入法: 1、 ROUND_UP:远离零方向舍入。向绝对值最大的方向舍入,只要舍弃位非0即进位。 2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。 3、 ROUND_CEILING:向正无穷方向舍入。向正最大方向靠拢。若是正数,舍入行为类似于ROUND_UP,若为负数,舍入行为类似于ROUND_DOWN。Math.round()方法就是使用的此模式。 4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。 5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。 6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。 7、 HAIL_EVEN:银行家舍入法。 主要介绍下第7个HAIL_EVEN: 四舍五入其实在金融方面运用的非常多,尤其是银行的利息。我们都知道银行的...
相关文章
文章评论
共有0条评论来说两句吧...