The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:
Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.
Get started with mocking and improve your application tests using our Mockito guide:
Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.
Get started with understanding multi-threaded applications with our Java Concurrency guide:
Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:
Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.
But these can also be overused and fall into some common pitfalls.
To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:
Get started with Spring and Spring Boot, through the Learn Spring course:
>> LEARN SPRINGExplore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:
Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.
I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.
You can explore the course here:
Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.
Get started with Spring Data JPA through the guided reference course:
Refactor Java code safely β and automatically β with OpenRewrite.
Refactoring big codebases by hand is slow, risky, and easy to put off. Thatβs where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.
Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions β one for newcomers and one for experienced users. Youβll see how recipes work, how to apply them across projects, and how to modernize code with confidence.
Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.
1. Overview
This cookbook shows how to use the Apache HttpClient in a variety of examples and use-cases.
We will demonstrate examples for both 5.x & 4.5 Version.
The format of the cookbook is example focused and practical β no extraneous details and explanations necessary.
If you want to dig deeper and learn other cool things you can do with the HttpClient β head on over to the main HttpClient tutorial.
2. Cookbook
2.1. Examples with Version 5.x
create the http client
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
send basic GET request
httpClient.execute(new HttpGet("http://www.google.com"),
response -> {
//handle response
}
);
get the Status Code of the HTTP Response
httpClient.execute(new HttpGet("http://www.google.com"),
response -> {
assertThat(response.getCode()).isEqualTo(200);
return response;
}
);
get the Media Type of the response
httpClient.execute(new HttpGet("http://www.google.com"),
response -> {
final String contentMimeType = ContentType.parse(response.getEntity().getContentType()).getMimeType();
assertThat(contentMimeType).isEqualTo(ContentType.TEXT_HTML.getMimeType());
return response;
}
);
get the body of the response
httpClient.execute(new HttpGet("http://www.google.com"),
response -> {
String bodyAsString = EntityUtils.toString(response.getEntity());
assertThat(bodyAsString, notNullValue());
return response;
}
);
configure the timeout on a request
RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(Timeout.ofMilliseconds(2000L)) .build();
request.setConfig(requestConfig);
httpClient.execute(request, response -> { //handle response }
configure timeout on the entire client
ConnectionConfig connConfig = ConnectionConfig.custom()
.setConnectTimeout(timeout, TimeUnit.MILLISECONDS)
.setSocketTimeout(timeout, TimeUnit.MILLISECONDS)
.build();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.ofMilliseconds(2000L))
.build();
BasicHttpClientConnectionManager cm = new BasicHttpClientConnectionManager();
cm.setConnectionConfig(connConfig);
CloseableHttpClient httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.build();
send a POST request
httpClient.execute(new HttpPost(SAMPLE_URL),
response -> {
//handle response
}
);
add parameters to a request
HttpPost httpPost = new HttpPost(SAMPLE_POST_URL);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key1", "value1"));
params.add(new BasicNameValuePair("key2", "value2"));
httpPost.setEntity(new UrlEncodedFormEntity(params);
configure how redirects are handled for an HTTP Request
CloseableHttpClient httpClient = HttpClientBuilder.create()
.disableRedirectHandling()
.build();
httpClient.execute(new HttpGet("http://t.co/I5YYd9tddw"),
response -> {
assertThat(response.getCode(), equalTo(301));
return response;
}
);
configure the headers for a request
HttpGet request = new HttpGet(SAMPLE_URL);
request.addHeader(HttpHeaders.ACCEPT, "application/xml");
httpClient.execute(request,
response -> {
//handle response
}
);
get the headers from the response
httpClient.execute(new HttpGet(SAMPLE_URL),
response -> {
Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE);
assertThat(headers, not(emptyArray()));
}
);
close/release resources
HttpGet httpGet = new HttpGet(SAMPLE_GET_URL);
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
httpClient.execute(httpGet, resp -> {
assertThat(resp.getCode()).isEqualTo(200);
return resp;
});
}
2.2. Examples with Version 4.5
create the http client
CloseableHttpClient client = HttpClientBuilder.create().build();
send basic GET request
client.execute(new HttpGet("http://www.google.com"));
get the Status Code of the HTTP Response
CloseableHttpResponse response = client.execute(new HttpGet("http://www.google.com"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));
get the Media Type of the response
CloseableHttpResponse response = client.execute(new HttpGet("http://www.google.com"));
String contentMimeType = ContentType.getOrDefault(response.getEntity()).getMimeType();
assertThat(contentMimeType, equalTo(ContentType.TEXT_HTML.getMimeType()));
get the body of the response
CloseableHttpResponse response = client.execute(new HttpGet("http://www.google.com"));
String bodyAsString = EntityUtils.toString(response.getEntity());
assertThat(bodyAsString, notNullValue());
configure the timeout on a request
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(1000)
.setConnectTimeout(1000)
.setSocketTimeout(1000)
.build();
HttpGet request = new HttpGet(SAMPLE_URL);
request.setConfig(requestConfig);
client.execute(request);
configure timeout on the entire client
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(1000)
.setConnectTimeout(1000)
.setSocketTimeout(1000)
.build();
HttpClientBuilder builder = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig);
client = builder.build();
send a POST request
client.execute(new HttpPost(SAMPLE_URL));
add parameters to a request
HttpPost httpPost = new HttpPost(SAMPLE_POST_URL);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key1", "value1"));
params.add(new BasicNameValuePair("key2", "value2"));
httpPost.setEntity(new UrlEncodedFormEntity(params);
configure how redirects are handled for an HTTP Request
CloseableHttpClient client = HttpClientBuilder.create()
.disableRedirectHandling()
.build();
CloseableHttpResponse response = client.execute(new HttpGet("http://t.co/I5YYd9tddw"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(301));
configure the headers for a request
HttpGet request = new HttpGet(SAMPLE_URL);
request.addHeader(HttpHeaders.ACCEPT, "application/xml");
response = client.execute(request);
get the headers from the response
CloseableHttpResponse response = client.execute(new HttpGet(SAMPLE_URL));
Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE);
assertThat(headers, not(emptyArray()));
close/release resources
try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpGet httpGet = new HttpGet(SAMPLE_URL);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
// handle response;
HttpEntity entity = response.getEntity();
if (entity != null) {
try (InputStream instream = entity.getContent()) {
// Process the input stream if needed
}
}
}
}
3. Go Deep Into HttpClient
The HttpClient library is quite a powerful tool if used correctly β if you want to start exploring what the client can do β check out some of the tutorials:
You can also dig a lot deeper into the HttpClient by exploring the entire series.
4. Conclusion
This format is a bit different from how I usually structure my articles β Iβm publishing some of my internal development cookbooks on a given topic β on Google Guava, Hamcrest and Mockito β and now HttpClient. The goal is to have this information readily available online β and to add to it whenever I run into a new useful example.
This is a Maven based project, so it should be easy to import and run as it is.
