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)));