33. 使用RestTemplate调用REST服务 如果你需要从你的应用调用远程REST服务,你可以使用Spring Framework的RestTemplate类。由于RestTemplate实例经常需要在使用前被定制,Spring Boot不提供任何单一的(single)自动配置的RestTemplatebean。但是,它会自动配置一个RestTemplateBuilder,这个可以用来在需要的时候创建RestTemplate实例。该自动配置的RestTemplateBuilder确保合理的HttpMessageConverters被应用到RestTemplate实例。

    下面的代码展示了一个典型的例子:

    1. @Service
    2. public class MyService {
    3.  
    4. private final RestTemplate restTemplate;
    5.  
    6. public MyService(RestTemplateBuilder restTemplateBuilder) {
    7. this.restTemplate = restTemplateBuilder.build();
    8. }
    9.  
    10. public Details someRestCall(String name) {
    11. return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    12. }
    13.  
    14. }

    RestTemplateBuilder包含许多可以快速配置一个RestTemplate的有用的方法。举个例子,要添加一个基本的认证支持,你可以使用builder.basicAuthorization(“user”, “password”).build()

    33.1 RestTemplate 定制化

    这里有3个主要途径来定制RestTemplate,取决于你要多大范围(broadly)的应用定制。

    为了使任何定制的范围尽肯能的精确,注入该自动配置的RestTemplateBuilder,之后根据需要调用他的方法。每个方法调用返回一个新的RestTemplate实例,因此该定制只影响这个builder的这次使用。

    为了使一个应用宽泛的、可添加的定制,使用一个RestTemplateCustomizerbean。所有这样的bean被自动注册到自动配置的RestTemplateBuilder并被应用到任何使用它构建的模板(template)。

    下面的例子,展示了一个定制器(customizer),它配置了为所有主机使用的一个代理 除了192.168.0.5

    1. static class ProxyCustomizer implements RestTemplateCustomizer {
    2.  
    3. @Override
    4. public void customize(RestTemplate restTemplate) {
    5. HttpHost proxy = new HttpHost("proxy.example.com");
    6. HttpClient httpClient = HttpClientBuilder.create()
    7. .setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
    8.  
    9. @Override
    10. public HttpHost determineProxy(HttpHost target,
    11. HttpRequest request, HttpContext context)
    12. throws HttpException {
    13. if (target.getHostName().equals("192.168.0.5")) {
    14. return null;
    15. }
    16. return super.determineProxy(target, request, context);
    17. }
    18.  
    19. }).build();
    20. restTemplate.setRequestFactory(
    21. new HttpComponentsClientHttpRequestFactory(httpClient));
    22. }
    23.  
    24. }

    最后,最极端的(很少被使用)选项是创建你自己的RestTemplateBuilderbean。这么做,关闭了RestTemplateBuilder的自动配置,并从正在使用的RestTemplateBuilder阻止任何RestTemplateCustomizer