This example shows how to configure Spring RestTemplate with Apache HttpClient 4.1 as a transport.
In this example we will configure the following parameters:
Also, we will set up Http Basic Authentication using login and password.
We are going to use JavaConfig @Configuration class, that has all the parameters set from properties using @Value annotations.
Lets define HttpClient @Bean by creating new PoolingClientConnectionManager and configuring maxConnectionsPerHost and maxTotalConnections.
Then we need to configure ClientHttpRequestFactory that allows to define read and connection timeouts.
Now we can create RestTemplate @Bean
Now we need to configure Http Basic Authentication. To do Basic Authentication we need to add Authentication: Basic header to HTTP request. We can do it by registering a HttpRequestInterceptor that would add the header to every request.
Register HttpRequestInterceptor in HttpClient:
Full source code:
In this example we will configure the following parameters:
- connection timeout
- read timeout
- maximum connections (per host)
- maximum connections (total)
Also, we will set up Http Basic Authentication using login and password.
We are going to use JavaConfig @Configuration class, that has all the parameters set from properties using @Value annotations.
@Configuration public class RestClientConfig { @Value("${rest.client.login}") private String restClientLogin; @Value("${rest.client.password}") private String restClientPassword; @Value("${rest.client.connectionTimeoutMillis}") private int restClientConnectionTimeoutMillis; @Value("${rest.client.readTimeoutMillis}") private int restClientReadTimeoutMillis; @Value("${rest.client.maxConnectionsPerHost}") private int restClientMaxConnectionsPerHost; @Value("${rest.client.maxTotalConnections}") private int restClientMaxTotalConnections; // ... }
Lets define HttpClient @Bean by creating new PoolingClientConnectionManager and configuring maxConnectionsPerHost and maxTotalConnections.
@Bean public HttpClient getHttpClient() { final PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); connectionManager.setDefaultMaxPerRoute(restClientMaxConnectionsPerHost); connectionManager.setMaxTotal(restClientMaxTotalConnections); final DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager); // ... return httpClient; }
Then we need to configure ClientHttpRequestFactory that allows to define read and connection timeouts.
@Bean public ClientHttpRequestFactory getClientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(getHttpClient()); factory.setConnectTimeout(restClientConnectionTimeoutMillis); factory.setReadTimeout(restClientReadTimeoutMillis); return factory; }
Now we can create RestTemplate @Bean
@Bean public RestTemplate getRestTemplate() { RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); return restTemplate; }
Now we need to configure Http Basic Authentication. To do Basic Authentication we need to add Authentication: Basic header to HTTP request. We can do it by registering a HttpRequestInterceptor that would add the header to every request.
public class HttpBasicAuthInterceptor implements HttpRequestInterceptor { private UsernamePasswordCredentials creds; public HttpBasicAuthInterceptor(UsernamePasswordCredentials creds) { this.creds = creds; } @Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { request.addHeader(new BasicScheme().authenticate(creds, request, context)); } }
Register HttpRequestInterceptor in HttpClient:
HttpRequestInterceptor interceptor = new HttpBasicAuthInterceptor(new UsernamePasswordCredentials(restClientLogin, restClientPassword)); httpClient.addRequestInterceptor(interceptor);
Full source code:
@Configuration public class RestClientConfig { @Value("${rest.client.login}") private String restClientLogin; @Value("${rest.client.password}") private String restClientPassword; @Value("${rest.client.connectionTimeoutMillis}") private int restClientConnectionTimeoutMillis; @Value("${rest.client.readTimeoutMillis}") private int restClientReadTimeoutMillis; @Value("${rest.client.maxConnectionsPerHost}") private int restClientMaxConnectionsPerHost; @Value("${rest.client.maxTotalConnections}") private int restClientMaxTotalConnections; @Bean public HttpClient getHttpClient() { final PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); connectionManager.setDefaultMaxPerRoute(restClientMaxConnectionsPerHost); connectionManager.setMaxTotal(restClientMaxTotalConnections); final DefaultHttpClient httpClient = new DefaultHttpClient(connectionManager); HttpRequestInterceptor interceptor = new HttpBasicAuthInterceptor(new UsernamePasswordCredentials(restClientLogin, restClientPassword)); httpClient.addRequestInterceptor(interceptor); return httpClient; } @Bean public ClientHttpRequestFactory getClientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(getHttpClient()); factory.setConnectTimeout(restClientConnectionTimeoutMillis); factory.setReadTimeout(restClientReadTimeoutMillis); return factory; } @Bean public RestTemplate getRestTemplate() { RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); return restTemplate; } } public class HttpBasicAuthInterceptor implements HttpRequestInterceptor { private UsernamePasswordCredentials creds; public HttpBasicAuthInterceptor(UsernamePasswordCredentials creds) { this.creds = creds; } @Override public void process(HttpRequest request, HttpContext context) throws HttpException, IOException { request.addHeader(new BasicScheme().authenticate(creds, request, context)); } }
Thanks I was looking exactly for such an example...
ReplyDelete