33. 使用RestTemplate调用REST服务
如果你需要从你的应用调用远程REST服务,你可以使用Spring Framework的RestTemplate类。由于RestTemplate实例经常需要在使用前被定制,Spring Boot不提供任何单一的(single)自动配置的RestTemplatebean。但是,它会自动配置一个RestTemplateBuilder,这个可以用来在需要的时候创建RestTemplate实例。该自动配置的RestTemplateBuilder确保合理的HttpMessageConverters被应用到RestTemplate实例。
下面的代码展示了一个典型的例子:
- @Service
- public class MyService {
- private final RestTemplate restTemplate;
- public MyService(RestTemplateBuilder restTemplateBuilder) {
- this.restTemplate = restTemplateBuilder.build();
- }
- public Details someRestCall(String name) {
- return this.restTemplate.getForObject("/{name}/details", Details.class, name);
- }
- }
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:
- static 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));
- }
- }
最后,最极端的(很少被使用)选项是创建你自己的RestTemplateBuilderbean。这么做,关闭了RestTemplateBuilder的自动配置,并从正在使用的RestTemplateBuilder阻止任何RestTemplateCustomizer。
