春天启动 - 休息模板和休息模板生成器

jav*_*ovy 9 java rest spring spring-mvc

据我所知,这RestTemplateBuilder是一种工厂RestTemplate.我有一些关于使用它的问题:

  1. 通常在示例中,@Configuration类中有类似的东西:

    @Bean
    public RestTemplate getRestClient() {
        RestTemplate restClient = new RestTemplate();
        ...
        return restClient;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    RestTemplate应该每个@Service类实例化?如果是这样,如何定制呢?

  2. Spring引用说RestTemplateBuilder应该通过自定义RestTemplateCustomizer.如何使用一个构建器从许多IP地址管理许多URI?

  3. 如何将BasicAuthenticationglobaly 添加到所有RestTemplatesvia RestTemplateBuilder,这是一个好习惯吗?

感谢帮助.

更新:

我的应用程序从不同的IP和URL的许多服务器调用休息服务 - 所以对我来说逻辑上就是我有很多的情况RestTemplates.

我正在尝试为RestTemplateBuilder每个服务器设置一个工厂() - 比如服务器A,B,C.我知道如何添加基本身份验证.但是,例如,当我想要服务器A的基本身份验证而不是服务器B的基本身份验证时?

我想RestTemplateBuilder每个服务器有一个.我不想手动执行此操作 - 我更喜欢使用Spring机制.

有帮助吗?

kuh*_*yan 8

  1. 不,您不需要,通常您将拥有休息模板实例,并且您将传递不同的URL,并且每次都相应地请求参数.

    String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, vars);
    
    Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class);
    
    Run Code Online (Sandbox Code Playgroud)
  2. spring doc中的描述性示例,您可以向构建器添加任意数量的自定义程序

    public 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));
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

任何RestTemplateCustomizer bean都将自动添加到自动配置的RestTemplateBuilder中.此外,通过调用additionalCustomizers(RestTemplateCustomizer ...)可以创建一个带有其他自定义程序的新RestTemplateBuilder.

@Bean
public RestTemplateBuilder restTemplateBuilder() {
   return new RestTemplateBuilder()
        .rootUri(rootUri)
        .basicAuthorization(username, password);
}
Run Code Online (Sandbox Code Playgroud)