«1. Обзор

В этом коротком руководстве мы рассмотрим, как отправить запрос на прокси с помощью RestTemplate.

2. Зависимости

Во-первых, RestTemplateCustomizer использует класс HttpClient для подключения к прокси-серверу.

Чтобы использовать класс, нам нужно добавить httpcore-зависимость Apache в наш файл Maven pom.xml:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.13</version>
</dependency>

Или в наш файл Gradle build.gradle:

compile 'org.apache.httpcomponents:httpcore:4.4.13'

3. Использование SimpleClientHttpRequestFactory ~~ ~ Отправить запрос на прокси с помощью RestTemplate довольно просто. Все, что нам нужно сделать, это вызвать setProxy(java.net.Proxy) из SimpleClientHttpRequestFactory перед созданием объекта RestTemplate.

Во-первых, мы начнем с настройки SimpleClientHttpRequestFactory:

Затем мы перейдем к передаче экземпляра фабрики запросов конструктору RestTemplate:

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

4. Использование RestTemplateCustomizer

ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://httpbin.org/get", String.class);

assertThat(responseEntity.getStatusCode(), is(equalTo(HttpStatus.OK)));

Другой подход заключается в использовании RestTemplateCustomizer с RestTemplateBuilder для создания настроенного RestTemplate.

Давайте начнем определение ProxyCustomizer:

После этого мы создадим наш настроенный RestTemplate:

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

5. Заключение

ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://httpbin.org/get", String.class);
assertThat(responseEntity.getStatusCode(), is(equalTo(HttpStatus.OK)));

В этом кратком руководстве мы рассмотрели два разных способа отправки запроса на прокси-сервер с помощью RestTemplate.

Сначала мы научились отправлять запрос через RestTemplate, построенный с использованием SimpleClientHttpRequestFactory. Затем мы узнали, как сделать то же самое, используя RestTemplateCustomizer, который является рекомендуемым подходом в соответствии с документацией.

Как всегда, образцы кода доступны на GitHub.

«