1. Overview

In this short tutorial, we'll take a look at how to send a request to a proxy using RestTemplate.

2. Dependencies

First, the RestTemplateCustomizer uses the HttpClient class to connect to the proxy.

To use the class, we need to add Apache's httpcore dependency to our Maven pom.xml file:

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

Or to our Gradle build.gradle file:

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

3. Using SimpleClientHttpRequestFactory

Sending a request to a proxy using RestTemplate is pretty simple. All we need to do is to call the setProxy(java.net.Proxy) from SimpleClientHttpRequestFactory before building the RestTemplate object.

First, we start by configuring the SimpleClientHttpRequestFactory:

Proxy proxy = new Proxy(Type.HTTP, new InetSocketAddress(PROXY_SERVER_HOST, PROXY_SERVER_PORT));
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setProxy(proxy);

Then, we move forward to passing the request factory instance to the RestTemplate constructor:

RestTemplate restTemplate = new RestTemplate(requestFactory);

Finally, once we have built the RestTemplate, we can use it to make proxied requests:

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

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

4. Using RestTemplateCustomizer

Another approach is to use a RestTemplateCustomizer* with RestTemplateBuilder to build a customized *RestTemplate.

Let's start defining a 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));
    }
}

After that, we build our customized RestTemplate:

RestTemplate restTemplate = new RestTemplateBuilder(new ProxyCustomizer()).build();

And finally, we use the RestTemplate to make requests that pass first through a proxy:

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

5. Conclusion

In this short tutorial, we've explored two different ways to send a request to a proxy using RestTemplate.

First, we learned how to send the request through a RestTemplate built using a SimpleClientHttpRequestFactory. Then we learned how to do the same using a RestTemplateCustomizer, this one being the recommended approach according to the documentation.

As always, the code samples are available over on GitHub.