美文网首页
RestTemplate

RestTemplate

作者: 不要加香菜 | 来源:发表于2017-12-01 14:18 被阅读0次

    常用于调用远程 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)

    参考

    相关文章

      网友评论

          本文标题:RestTemplate

          本文链接:https://www.haomeiwen.com/subject/afvsbxtx.html