繁体   English   中英

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

[英]Spring boot - rest template and rest template builder

当我知道RestTemplateBuilder某种工厂的RestTemplate 我有一些关于使用它的问题:

  1. 在示例中, @Configuration类中有类似的内容:

     @Bean public RestTemplate getRestClient() { RestTemplate restClient = new RestTemplate(); ... return restClient; } 

    不应该根据@Service类实例化RestTemplate吗? 如果是这样,如何定制呢?

  2. Spring参考说, RestTemplateBuilder应通过定制RestTemplateCustomizer 如何使用一个构建器从许多IP地址管理许多URI?

  3. 如何通过RestTemplateBuilderBasicAuthentication RestTemplates添加到所有RestTemplateBuilder ,这是一个好习惯吗?

感谢帮助。

更新

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

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

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

有帮助吗?

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

     String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, vars); Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class); 
  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)); } } 

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

@Bean
public RestTemplateBuilder restTemplateBuilder() {
   return new RestTemplateBuilder()
        .rootUri(rootUri)
        .basicAuthorization(username, password);
}

我已经设置了这样的配置:

@Bean
public RestTemplateCustomizer restTemplateCustomizer() {
    return restTemplate -> {
        restTemplate.setRequestFactory(clientHttpRequestFactory());
    };
}

@Bean
public ClientHttpRequestFactory clientHttpRequestFactory() {
    SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory();
    clientHttpRequestFactory.setConnectTimeout(connectionTimeoutMs);
    clientHttpRequestFactory.setReadTimeout(connectionTimeoutMs);
    clientHttpRequestFactory.setBufferRequestBody(false);
    return clientHttpRequestFactory;
}

每当Spring注入RestTemplateBuilder时,它将使用此RestTemplateCustomizer配置它以使用ClientHttpRequestFactory。 您可能需要执行一些不同的自定义,或者可能没有在这种情况下不要声明bean。

要添加身份验证标头,您需要知道用户名和密码,在运行时可能不会知道。 所以我创建了一个Authenticator bean:

@Component
public class Authenticator {

    @Autowired
    private RestTemplateBuilder restTemplateBuilder;

    public void withAuthenticationHeader(String username, String password, Consumer<RestTemplate> doAuthenticated) {
        RestTemplate restTemplate =
            restTemplateBuilder
                .basicAuthorization(username, password)
                .build();

        try {
            doAuthenticated.accept(restTemplate);

        } catch (HttpClientErrorException exception) {
            // handle the exception
        }
    }
}

这允许我以标准方式处理所有请求的身份验证失败,这是我在我的应用程序中所需要的。

它被注入其他bean并像这样使用:

@Autowired
private Authenticator authenticator;

public void transmit() {
    authenticator.withAuthenticationHeader(username, password, restTemplate -> 
        restTemplate.postForLocation(url, request));
}

所以你要使用Authenticator而不是直接使用RestTemple。 我无法找到任何标准模式,但这似乎有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM