如果您需要从应用程序中调用远程REST服务,则可以使用Spring Framework的RestTemplate类。由于RestTemplate实例在使用前通常需要自定义,因此Spring Boot不提供任何单个自动配置的RestTemplatebean。但是,它会自动配置a RestTemplateBuilder,可以RestTemplate在需要时创建实例。自动配置RestTemplateBuilder可确保明智HttpMessageConverters地应用于RestTemplate实例。
以下代码显示了一个典型示例:

  1. @Service
  2. public class MyService {
  3. private final RestTemplate restTemplate;
  4. public MyService(RestTemplateBuilder restTemplateBuilder) {
  5. this.restTemplate = restTemplateBuilder.build();
  6. }
  7. public Details someRestCall(String name) {
  8. return this.restTemplate.getForObject("/{name}/details", Details.class, name);
  9. }
  10. }
RestTemplateBuilder包括许多有用的方法,可用于快速配置RestTemplate。例如,要添加BASIC身份验证支持,可以使用builder.basicAuthentication("user", "password").build()

15.1 RestTemplate自定义

有三种主要的RestTemplate自定义方法,具体取决于您希望自定义应用的范围。
为了使所有自定义的范围尽可能缩小,请注入自动配置的内容RestTemplateBuilder,然后根据需要调用其方法。每个方法调用都返回一个新RestTemplateBuilder实例,因此自定义仅影响构建器的使用。
要进行应用程序范围的附加自定义,请使用RestTemplateCustomizerBean。所有此类bean都会自动向自动配置中注册,RestTemplateBuilder并应用于自动生成的任何模板。
以下示例显示了一个定制器,该定制器为除以下之外的所有主机配置代理的使用192.168.0.5

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

最后,您还可以创建自己的RestTemplateBuilderbean。为防止关闭a的自动配置RestTemplateBuilder并防止使用任何RestTemplateCustomizerbean,请确保使用来配置自定义实例RestTemplateBuilderConfigurer。下面的示例展示了RestTemplateBuilderSpring Boot将自动配置的a,除了还指定了自定义连接和读取超时:

  1. @Bean
  2. public RestTemplateBuilder restTemplateBuilder(RestTemplateBuilderConfigurer configurer) {
  3. return configurer.configure(new RestTemplateBuilder()).setConnectTimeout(Duration.ofSeconds(5))
  4. .setReadTimeout(Duration.ofSeconds(2));
  5. }

最极端(很少使用)的选项是在RestTemplateBuilder不使用配置程序的情况下创建自己的bean。这样做会关闭a的自动配置,RestTemplateBuilder并防止使用任何RestTemplateCustomizerbean。