httpclient-spring-boot-starter
This project provides a Spring-Boot Starter that enables the additional configuration of the used Httpclients.
It supports the configuration of OkHttp and Apache HttpClient which are also the supported Clients in Spring.
Usage
The httpclient-spring-boot-starter brings most of the required configuration with it, therefor you only need to add it as a maven dependency and enable the desired Httpclient.
<dependency>
<groupId>de.dev-eth0.spring-boot.httpclient</groupId>
<artifactId>httpclient-spring-boot-starter</artifactId>
<version>LATEST-VERSION</version>
</dependency>
Make sure, that you have either org.apache.httpcomponents:httpclient or com.squareup.okhttp3:okhttp declared as a dependency and enable the configuration as described in spring-cloud-commons - http-clients.
This will make sure, that the spring-cloud dependencies use the custom client configurations.
Feign
Feign uses a different configuration to enable the clients: feign.okhttp.enabled and feign.httpclient.enabled.
RestTemplate
To make sure, your RestTemplate uses the custom client, you need to configure it accordingly:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder, ClientHttpRequestFactory clientHttpRequestFactory) {
return builder.requestFactory(() -> clientHttpRequestFactory).build();
}
Configuration
All configuration values are prefixed with http.client (e.g. http.client.timeouts.connectionTimeout).
It's possible to configure the proxy based on the requested hostnames using the hostPattern config.
| Config | Description | Default | Example |
|---|---|---|---|
| sslContext | SSL Version (optional) | TLSv1.2 |
TLSv1.3 |
| timeouts.connectionTimeout (optional) | Connection Timeout in ms | 5000 | |
| timeouts.socketTimeout (optional) | Socket Timeout in ms, for OkHttp this is used as readTimeout and writeTimeout | 10000 | |
| proxies[] (optional) | Configuration for used proxy servers | ||
| proxies[].hostPatterns | Pattern for matching the hostname, empty matches all | empty | google.* |
| proxies[].proxyHost | Hostname or IP of the Proxy | 10.0.9.1 or corp-proxy.domain |
|
| proxies[].proxyPort | Port of the Proxy (optional) | 3128 | |
| proxies[].proxyUser | Proxy user name (optional) | testUser |
|
| proxies[].proxyPassword | Proxy password (optional) | testPassword |
|
| keystore.path | Keystore file path | classpath:keystore.jks |
|
| keystore.password | Keystore password | changeit |
|
| keystore.type | Keystore type (optional) | PKCS12 |
|
| truststore.path | Truststore file path | classpath:truststore.jks |
|
| truststore.password | Truststore password | changeit |
|
| truststore.type | Truststore type (optional) | JKS |
Example:
http:
client:
proxies:
- hostPatterns: ["google.de]
proxyHost: localhost
proxyPort: 3333
proxyUser: testUser
proxyPassword: testPassword
timeouts:
connectionTimeout: 5000
socketTimeout: 10000
Sample Project
You can find a sample project which configures both Feign and RestTemplate to use either OkHttp or Apache HttpClient in /httpclient-spring-boot-sample.
The project includes the spring-boot-maven-plugin therefor you can simply run mvn clean install spring:boot-run. By default, the project uses Apache HttpClient, if you want to use OkHttp, you can use the following command:
SPRING_PROFILES_ACTIVE=okhttp mvn spring-boot:run
The project also contains a docker-compose.yml file which starts several local servers to demonstrate the usecases.