RestTemplate

常用于调用远程 REST 服务。

由于RestTemplate实例经常需要在使用之前进行定制,因此 Spring Boot 不提供任何自动配置的RestTemplate bean,但是,它会自动配置一个RestTemplateBuilder,可用于在需要的时候使用RestTemplateBuilder创建RestTemplate实例。自动配置的RestTemplateBuilder将确保将合理的HttpMessageConverters应用于RestTemplate实例。

@Service
public class MyBean {

    private final RestTemplate restTemplate;

    public MyBean(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();

        // RestTemplateBuilder包含许多可用于快速配置RestTemplate的有用方法
        // 例如,要添加BASIC认证支持,可以使用
        // this.restTemplate = restTemplateBuilder.basicAuthorization("user","password").build();
    }

    public Details someRestCall(String name) {
        return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    }

}

自定义RestTemplate

RestTemplate自定义有三种主要方法,具体取决于您希望自定义应用的范围

  1. 类范围。为了尽可能缩小任何自定义的范围,请注入自动配置的RestTemplateBuilder,然后根据需要调用其方法。如上述代码,建造者模式中每个方法调用都会返回一个新的RestTemplateBuilder实例。这是在构造器内来配置,自定义的RestTemplate应用范围是一个类。

  2. 应用范围。要对整个应用程序范围的附加定制,可以使用RestTemplateCustomizer bean。所有这些 bean 都会自动注册到自动配置的RestTemplateBuilder中,并将应用于随其构建的任何RestTemplate

    以下是一个定制程序示例,它为192.168.0.5以外的所有主机配置代理的使用:

    static class ProxyCustomizer implements RestTemplateCustomizer {
    
        @Override
        public void customize(RestTemplate restTemplate) {
            HttpHost proxy = new HttpHost("proxy.example.com");
            HttpClient httpClient = HttpClientBuilder.create()
                    .setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
    
                        @Override
                        public HttpHost determineProxy(HttpHost target,
                                HttpRequest request, HttpContext context)
                                throws HttpException {
                            if (target.getHostName().equals("192.168.0.5")) {
                                return null;
                            }
                            return super.determineProxy(target, request, context);
                        }
    
                    }).build();
            restTemplate.setRequestFactory(
                    new HttpComponentsClientHttpRequestFactory(httpClient));
        }
    
    }
    
  3. 最后,最极端的(也是很少使用的)选项是创建你自己的RestTemplateBuilder bean。这将关闭RestTemplateBuilder的自动配置,并阻止使用任何RestTemplateCustomizer bean。

http 连接池

RestTemplate默认不使用连接池,如果想使用则需要一个ClientHttpRequestFactory接口的实现类来池化连接。例如使用HttpComponentsClientHttpRequestFactory

RestTemplate restT = new RestTemplate(new HttpComponentsClientHttpRequestFactory());

注意HttpComponentsClientHttpRequestFactoryorg.springframework.http.client.ClientHttpRequestFactory的实现类,它底层使用了Apache HttpComponents HttpClient 来创建请求.

另外

以上是 Spring Boot 2.0 以下的远程 REST 服务调用方式,在 Spring Boot 2.0 开始增加了WebClient方式。详情参见官方文档:Spring Boot 2.0.2.RELEASE Reference Guide - Calling REST Services with WebClient

异步调用(AsyncRestTemplate)

参考

  • Spring Boot 1.5.13.RELEASE Reference Guide
  • Spring Boot 2.0.2.RELEASE Reference Guide
  • springboot学习记录之RestTemplate
  • Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)

你可能感兴趣的:(RestTemplate)