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

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
分享到:
评论

相关推荐

    SpringCloud简单使用RestTemplate调用对方的服务

    1. **创建RestTemplate实例**:首先,在Spring Boot的配置类或者需要调用远程服务的类中,通过`@Bean`注解创建一个`RestTemplate`实例。 ```java @Bean public RestTemplate restTemplate() { return new ...

    RestTemplate实现服务间调用demo案例

    Spring Cloud为了解决这个问题,提供了一种简单易用的工具——RestTemplate。本示例将详细解析如何利用RestTemplate进行服务间的调用,帮助开发者理解并实践相关知识。 首先,我们要知道什么是RestTemplate。...

    spring-cloud-eureka 服务注册及发现实例

    为了实现服务的注册,我们需要在 Spring Boot 的主类上添加 `@EnableEurekaClient` 注解,这样 Spring Boot 将会初始化 Eureka 客户端。 ```java @SpringBootApplication @EnableEurekaClient public class My...

    sxyServer.zip

    Spring Boot提供了一个强大的工具——RestTemplate,用于发起HTTP请求。RestTemplate允许你发送GET、POST等HTTP方法请求,并处理响应。此外,Spring Web模块还引入了WebClient,这是一个反应式HTTP客户端,适用于...

    spring cloud eureka微服务之——服务注册发现、服务消费者,服务提供者简单实例

    1. **创建Eureka Server**:首先,创建一个Spring Boot项目,引入Eureka Server的相关依赖,配置Eureka Server的相关属性,如端口号、服务实例的过期时间等,然后启动服务。 2. **创建服务提供者**:接着,创建服务...

    consul+springboot+gradle-demo.zip

    在这个项目中,我们将使用`Spring Cloud Consul`,它是`Spring Cloud`的一个子项目,为`Spring Boot`应用提供了与`Consul`集成的能力。 然后,我们看看`Gradle`。`Gradle`是一种声明式构建工具,允许开发者通过编写...

    SpringCloud教程

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具包,它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据...

    springcloud-nacos-demo.zip

    本篇文章将深入探讨如何将SpringCloud与Nacos进行有效整合,通过具体的项目实例——"springcloud-nacos-demo",来解析这一过程的关键知识点。 一、SpringCloud简介 SpringCloud是基于Spring Boot实现的云应用开发...

    springCloud入门基本代码(基础篇)

    在Spring Cloud中,服务提供者通常是一个包含业务逻辑的应用程序,它通过Spring Boot的注解配置,声明式地暴露RESTful接口。在本压缩包中,服务提供者可能包含了处理业务请求的Controller,以及相关的Service、...

    Spring cloud实现服务注册及发现

    1. **服务消费者发现服务**:在服务消费者应用中,使用`@LoadBalanced`注解的RestTemplate或者Feign客户端,可以自动从Eureka Server获取服务提供者的信息,实现负载均衡的请求分发。 2. **健康检查**:Eureka ...

    spring-cloud-example-ribbon

    在Spring Boot项目中,我们可以使用Spring Cloud的`@EnableRibbonClient`注解来启用Ribbon客户端。同时,通过配置文件(application.yml或application.properties)可以设置Ribbon的相关属性,如服务器列表、超时...

    springboot 微服务负载均衡

    Spring Boot,作为一个轻量级的Java框架,提供了构建微服务的便捷方式。在这个场景下,我们将讨论如何利用Spring Boot来实现微服务的负载均衡,并通过HTTPS对外提供安全的访问接口,同时在内网内部实现服务消费者和...

    springcloud-consul-provider:spring cloud中使用consul作为注册中心——服务提供者

    Spring Cloud Consul是Spring Cloud官方提供的一个子项目,用于集成Spring Boot应用和Consul。它允许应用通过简单的配置即可使用Consul的服务发现、配置中心等功能。 3. **服务提供者(Provider)的角色**: 在...

    Spring cloud 理论+实践+解析 手摸手带你一起搭建(二 Eureka服务注册中心)例程

    在本教程中,我们将深入探讨Spring Cloud的核心组件之一——Eureka,它是微服务架构中的服务发现工具。Eureka是Netflix开发的一个组件,主要用于实现服务的注册与发现,它使得服务提供者可以将自己的服务注册到...

    02 微服务负载均衡器Ribbon&LoadBalancer实战.pdf

    LoadBalancer通常指的是服务端负载均衡,例如在Spring Cloud中,可以与`RestTemplate`或`WebClient`结合使用,通过指定的负载均衡策略实现服务调用的均衡。 1. `RestTemplate`整合LoadBalancer:通过`@LoadBalanced...

    客户端负载均衡器Ribbon(实验代码)

    3. **API调用**:在微服务之间的交互中,使用`RestTemplate`或`Feign`客户端,它们都内置了Ribbon的负载均衡功能。在发起请求时,Ribbon会自动选择一个服务实例进行调用。 4. **自定义负载均衡策略**:如果需要...

    skizmflop-service-registry:使用Eureka的Spring Cloud微服务注册表

    在本文中,我们将深入探讨如何使用Eureka构建一个基于Spring Cloud的服务注册表——skizmflop-service-registry。 ### 1. Eureka基本概念 - **Eureka Server**: Eureka服务器是服务注册中心,负责服务的注册、心跳...

Global site tag (gtag.js) - Google Analytics