`
234390216
  • 浏览: 10193124 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460799
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771778
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395406
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393879
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678208
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529286
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178711
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461848
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150116
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66833
社区版块
存档分类
最新评论

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所写)

0
0
分享到:
评论

相关推荐

    spring-boot——web笔记

    适合初学者spring-boot——web笔记

    Spring Boot系列——日志配置.docx

    日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节。但是,这丝毫不影响它在任何一个系统中的重要的地位。 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以...

    spring boot整合JPA——demo

    spring boot整合JPA——demo

    Spring boot 示例 官方 Demo

    spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 ...spring-boot-admin-simple:Spring Boot Admin 的使用示例

    Spring boot——@DeclareParents例子

    Spring boot——@DeclareParents例子...

    RestTemplate如何在Spring或非Spring环境下使用.docx

    RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache ...但是相对于直接使用底层的HTTP客户端库,它的操作更加方便、快捷,能很大程度上提升我们的开发效率。

    Spring Boot和Hazelcast使用详解

    主要介绍了Spring Boot和Hazelcast使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java毕业设计——基于spring boot的就业信息管理网站设计与实现(源码+数据库).zip

    java毕业设计——基于spring boot的就业信息管理网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的就业信息管理网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的就业信息管理...

    Spring Boot 2 Recipes

    使用微服务进行Web服务开发并与Spring Boot应用程序集成 无缝添加持久性和数据层,使您的Spring Boot Web应用程序做得更多 使用Spring Boot集成企业服务以创建更复杂的Java应用程序 本书适用于经验丰富的Java和...

    基于 Spring Boot + MySQL 开发的博客系统源码.zip

    基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring Boot + MySQL 开发的博客系统源码 基于 Spring ...

    Spring cloud和Spring boot介绍

    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只...

    Spring Boot 2.X 实战教程.pdf

    本课程内容包括Spring简介、Spring Boot简介、安装JDK、安装Maven、第一个Spring Boot程序(使用Spring Initializr构建、Spring Boot代码讲解、安装Notepad++)、构建系统、代码、配置、三种方式运行程序、安装...

    基于spring boot餐厅管理系统源码.zip

    基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 基于spring boot餐厅管理系统源码 ...

    spring boot 42讲配套源码.zip

    个人备份; 第 1-3 课 Spring Boot 依赖环境和项目结构介绍 第 1-4 课:写一个 Hello World 来感受 Spring Boot/hello ...第 2-9 课:Spring Boot 中使用 Swagger2 构建 RESTful APIs/spring-boot-sw

    Beginning Spring Boot 2

    Beginning Spring Boot 2 Beginning Spring Boot 2 Beginning Spring Boot 2

    Spring Boot整合Spring Batch,实现批处理

    Spring Boot整合Spring Batch的一个小例子,在网上发现这方面的资源比较少,特此将其上传供大家学习。

    java毕业设计——基于spring boot的音乐播放网站设计与实现(源码+数据库).zip

    java毕业设计——基于spring boot的音乐播放网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的音乐播放网站设计与实现(源码+数据库).zip java毕业设计——基于spring boot的音乐播放网站设计与...

    about learning Spring Boot. Spring Boot 教程、技术栈示例代码,快速简单上手教程.zip

    Spring Boot 使用的各种示例,以最简单、最实用为标准,此开源项目中的每个示例都以最小依赖,最简单为标准,帮助初学者快速掌握 Spring Boot 各组件的使用。 本项目中所有示例均已经更新到 Spring Boot 3.0 ...

    Spring Boot Examples

    Spring boot使用的各种示例,以最简单、最实用为标准 spring-boot-helloWorld:spring-boot的helloWorld版本 spring-boot-mybaits-annotation:注解版本 spring-boot-mybaits-xml:xml配置版本 spring-boot-...

Global site tag (gtag.js) - Google Analytics