Use the HttpClient Accessor To Configure Requests To Remote Services
The SAP Cloud SDK offers basic functionality that helps with connecting to other systems and services like SAP S/4HANA Cloud or On-premise edition.
The SAP Cloud SDK leverages the existing API of HttpClient
and applies conveniently managed properties, e.g. according to a specific destination configuration.
In the following paragraphs, the HttpClientAccessor
API and its usage will be described.
General Usage
In general an HttpClient
can be instantiated through the HttpClientAcessor
.
The SAP Cloud SDK itself uses the accessor class for all internal requests as well.
HttpClient client = HttpClientAccessor.getHttpClient();
If On-premise the goal is to create a client with properties according to a specific destination, it can be provided as argument:
HttpDestination destination = DestinationAccessor.getDestination("my-destination").asHttp();
HttpClient client = HttpClientAccessor.getHttpClient(destination);
When using a destination, the configured destination URL will be used as base path for the subsequent requests for client
.
Please note that similar to other accessor-based APIs, the SAP Cloud SDK offers methods with a try
prefix to allow for optional VAVR-enhanced API access.
Customization
When the properties of HttpClient
are not working for the application, e.g. timeout is too short or too long, then the generation can be customized.
Please find the HttpClientFactory
interface and the provided implementation DefaultHttpClientFactory
.
They offer a similar method createHttpClient
with optional destination argument:
HttpClientFactory factory = new DefaultHttpClientFactory();
HttpClient genericClient = factory.createHttpClient();
HttpClient destinationClient = factory.createHttpClient(destination);
The DefaultHttpClientFactory
type offers a static builder, to enable custom properties for:
timeoutMilliseconds
maxConnectionsPerRoute
maxConnectionsTotal
HttpClientFactory customFactory = DefaultHttpClientFactory.builder()
.timeoutMilliseconds(60000)
.maxConnectionsPerRoute(100)
.maxConnectionsTotal(200)
.build();
When inheriting from DefaultHttpClientFactory
it's possible to provide even deeper customization:
DefaultHttpClientFactory customFactory = new DefaultHttpClientFactory() {
@Override
protected RequestConfig.Builder getRequestConfigBuilder( HttpDestinationProperties destination ) {
return super.getRequestConfigBuilder(destination)
.setProxy(new HttpHost("proxy", 8080, "http"));
}
@Override
protected HttpClientBuilder getHttpClientBuilder( HttpDestinationProperties destination ) {
return super.getHttpClientBuilder(destination)
.setUserAgent("SDK");
}
};
It is possible to take advantage of calls to super
- or use your own objects directly.
This inheritance enables custom implementation for the following methods:
getHttpClientBuilder
getRequestConfigBuilder
getSocketConfigBuilder
getConnectionManager
Overriding Default Behavior
Now the customization of the HTTP client factory is available and we can adjust the default behavior for the accessor:
HttpClientFactory factory = new MyCustomHttpClientFactory();
HttpClientAccessor.setHttpClientFactory(factory);
From now on the custom factory will be used for every explicit and implicit HTTP request running through the SAP Cloud SDK.