[英]Spring boot - rest template and rest template builder
当我知道RestTemplateBuilder
某种工厂的RestTemplate
。 我有一些关于使用它的问题:
在示例中, @Configuration
类中有类似的内容:
@Bean public RestTemplate getRestClient() { RestTemplate restClient = new RestTemplate(); ... return restClient; }
不应该根据@Service
类实例化RestTemplate
吗? 如果是这样,如何定制呢?
Spring参考说, RestTemplateBuilder
应通过定制RestTemplateCustomizer
。 如何使用一个构建器从许多IP地址管理许多URI?
如何通过RestTemplateBuilder
将BasicAuthentication
RestTemplates
添加到所有RestTemplateBuilder
,这是一个好习惯吗?
感谢帮助。
更新 :
我的应用程序从不同IP和URL的许多服务器调用休息服务 - 所以对我来说逻辑上是我有许多RestTemplates
。
我正在尝试为每个服务器建立一个工厂( RestTemplateBuilder
) - 比如服务器A,B,C。我知道如何添加基本身份验证。 但是,例如,当我想要服务器A的基本身份验证而不是服务器B的基本身份验证时?
我想每个服务器有一个RestTemplateBuilder
。 我不想手动执行此操作 - 我更喜欢使用Spring机制。
有帮助吗?
不,您不需要,通常您将拥有休息模板实例,并且您将传递不同的URL,并且每次都相应地请求参数。
String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, vars); Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class);
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.