Skip to content

Apache HttpClient

Web & HTTPNetworking/HTTPJava

What it is

Apache HttpClient is a robust and feature-rich HTTP client library for Java. It allows sending HTTP requests, handling responses, managing connections, cookies, authentication, and supporting advanced features like redirects and timeouts.

HttpClient allows creating HTTP requests (GET, POST, PUT, DELETE), handling responses, managing cookies, setting headers, handling timeouts, and supporting connection pooling. It supports both synchronous and asynchronous request execution.

Installation

Add dependency in pom.xml: <dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.2</version> </dependency>

Getting started

The smallest useful thing you can do with it, and what each part means.

Simple GET request
import org.apache.hc.client5.http.fluent.Request;

String response = Request.get("https://httpbin.org/get").execute().returnContent().asString();
System.out.println(response);
Performs a simple GET request and prints the response content.
Simple POST request
import org.apache.hc.client5.http.fluent.Request;
import org.apache.hc.core5.http.io.entity.StringEntity;

String json = "{\"key\": \"value\"}";
String response = Request.post("https://httpbin.org/post")
    .bodyString(json, org.apache.hc.core5.http.ContentType.APPLICATION_JSON)
    .execute().returnContent().asString();
System.out.println(response);
Sends a POST request with JSON payload and prints the response.

Advanced usage

Where the library earns its place over a simpler alternative.

Custom headers
import org.apache.hc.client5.http.fluent.Request;

String response = Request.get("https://httpbin.org/headers")
    .addHeader("User-Agent", "MyHttpClient/1.0")
    .execute().returnContent().asString();
System.out.println(response);
Adds custom headers to the request.
Handling timeouts
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.classic.methods.HttpGet;

RequestConfig config = RequestConfig.custom().setResponseTimeout(5_000).build();
try (CloseableHttpClient client = HttpClients.custom().setDefaultRequestConfig(config).build()) {
    HttpGet request = new HttpGet("https://httpbin.org/delay/10");
    client.execute(request);
} catch (Exception e) {
    System.out.println("Request timed out");
}
Sets a timeout to prevent indefinite waiting.
Using connection pool
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(50);
cm.setDefaultMaxPerRoute(10);
CloseableHttpClient client = HttpClients.custom().setConnectionManager(cm).build();
Manages multiple HTTP connections efficiently using a connection pool.
Basic authentication
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;

BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(new UsernamePasswordCredentials("user", "password".toCharArray()));
CloseableHttpClient client = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
Sets up basic authentication for requests.

Errors and fixes

The failures you are most likely to hit, and what actually resolves them.

IOException
Occurs when there is a network error or server is unreachable. Handle exceptions appropriately.
HttpResponseException
Occurs when the response status code indicates an error. Check status code and handle accordingly.
ConnectionPoolTimeoutException
Occurs when connections cannot be acquired from the pool. Adjust pool size or release connections promptly.

Best practices

  • Use connection pooling for high-performance applications.
  • Always set timeouts to avoid hanging requests.
  • Use fluent API for simpler code and readability.
  • Handle exceptions like IOExceptions to ensure reliability.
  • Close resources properly using try-with-resources or clients’ close() methods.

Background

Why it exists, and what it was reacting to.

HttpClient was created to simplify HTTP communication in Java applications. It abstracts the complexities of HTTP connections, supports synchronous and asynchronous operations, and provides utilities for headers, cookies, and authentication. Widely used in web services, REST clients, and integrations, it ensures reliable and maintainable HTTP communication.