1.介绍
了解如何使用 RestTemplate 向代理发送请求。
2.依赖
首先,RestTemplateCustomizer 使用 HttpClient 类连接到代理。
要使用该类,需要将 Apache 的 httpcore 依赖添加到 Maven pom.xml 文件中:
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.13</version>
</dependency>
 
gradle依赖
compile 'org.apache.httpcomponents:httpcore:4.4.13'
 
3.使用SimpleClientHttpRequestFactory
使用 RestTemplate 向代理发送请求非常简单。 需要做的就是在构建 RestTemplate 对象之前从 SimpleClientHttpRequestFactory 调用 setProxy(java.net.Proxy)。
首先,从配置 SimpleClientHttpRequestFactory 开始:
Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);
 
然后,继续将请求工厂实例传递给 RestTemplate 构造函数:
RestTemplate restTemplate = new RestTemplate(requestFactory);
 
最后,一旦构建了 RestTemplate,就可以使用它来发出代理请求:
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://httpbin.org/get", String.class);
assertThat(responseEntity.getStatusCode(), is(equalTo(HttpStatus.OK)));
 
4.使用RestTemplateCustomizer
另一种方法是使用带有 RestTemplateBuilder 的 RestTemplateCustomizer 来构建自定义的 RestTemplate。
定义一个 ProxyCustomizer:
class ProxyCustomizer implements RestTemplateCustomizer {
    @Override
    public void customize(RestTemplate restTemplate) {
        HttpHost proxy = new HttpHost(PROXY_SERVER_HOST, PROXY_SERVER_PORT);
        HttpClient httpClient = HttpClientBuilder.create()
            .setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
                @Override
                public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context) throws HttpException {
                    return super.determineProxy(target, request, context);
                }
            })
            .build();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
    }
}
 
之后,构建自定义的 RestTemplate:
RestTemplate restTemplate = new RestTemplateBuilder(new ProxyCustomizer()).build();
 
最后,使用 RestTemplate 发出通过代理的请求:
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://httpbin.org/get", String.class);
assertThat(responseEntity.getStatusCode(), is(equalTo(HttpStatus.OK)));









