HttpClient 4 Cookbook

1. Overview

This cookbook shows how to use the Apache HttpClient 4 in a variety of examples and use-cases.

The focus is on HttpClient 4.3.x and above, so some of the examples may not work with the older versions of the API.

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

Create the http client:

CloseableHttpClient client = HttpClientBuilder.create().build();

Send basic GET request:

instance.execute(new HttpGet("http://www.google.com"));

Get the Status Code of the HTTP Response:

CloseableHttpResponse response = instance.execute(new HttpGet("http://www.google.com"));
assertThat(response.getStatusLine().getStatusCode(), equalTo(200));

Get the Media Type of the response:

CloseableHttpResponse response = instance.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 = instance.execute(new HttpGet("http://www.google.com"));
String bodyAsString = EntityUtils.toString(response.getEntity());
assertThat(bodyAsString, notNullValue());

Configure the timeout on a request:

@Test(expected = SocketTimeoutException.class)
public void givenLowTimeout_whenExecutingRequestWithTimeout_thenException() 
    throws ClientProtocolException, IOException {
    RequestConfig requestConfig = RequestConfig.custom()
      .setConnectionRequestTimeout(1000).setConnectTimeout(1000).setSocketTimeout(1000).build();
    HttpGet request = new HttpGet(SAMPLE_URL);
    request.setConfig(requestConfig);
    instance.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);

Send a POST request:

instance.execute(new HttpPost(SAMPLE_URL));

Add parameters to a request:

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("key1", "value1"));
params.add(new BasicNameValuePair("key2", "value2"));
request.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8));

Configure how redirect are handled for an HTTP Request:

CloseableHttpClient instance = HttpClientBuilder.create().disableRedirectHandling().build();
CloseableHttpResponse response = instance.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 = instance.execute(request);

Get the headers from the response:

CloseableHttpResponse response = instance.execute(new HttpGet(SAMPLE_URL));
Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE);
assertThat(headers, not(emptyArray()));

Close/release resources:

response = instance.execute(new HttpGet(SAMPLE_URL));
try {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        instream.close();
    }
} finally {
    response.close();
}

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:

  • HttpClient 4 – Get the Status Code
  • HttpClient – Set Custom Header

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 andMockito – 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.

The implementation of all these examples and code snippets can be found in over on GitHub.

This is a Maven based project, so it should be easy to import and run as it is.

Related posts:

Java Program to Find Basis and Dimension of a Matrix
Quản lý bộ nhớ trong Java với Heap Space vs Stack
HttpClient 4 – Follow Redirects for POST
Spring Data JPA and Null Parameters
Java Program to Check Whether a Directed Graph Contains a Eulerian Path
Java – File to Reader
Java Program to Implement Quick sort
Pagination and Sorting using Spring Data JPA
Hướng dẫn Java Design Pattern – Memento
Interface trong Java 8 – Default method và Static method
Java Program to Remove the Edges in a Given Cyclic Graph such that its Linear Extension can be Found
Java TreeMap vs HashMap
Partition a List in Java
Java Program to Check whether Directed Graph is Connected using DFS
Java Convenience Factory Methods for Collections
Apache Camel with Spring Boot
Java Program to find the maximum subarray sum using Binary Search approach
The Modulo Operator in Java
Java Program to Test Using DFS Whether a Directed Graph is Weakly Connected or Not
Convert char to String in Java
Converting between an Array and a List in Java
Write/Read cookies using HTTP and Read a file from the internet
Java Program to Implement Min Hash
Guide to Spring Cloud Kubernetes
Java Program to Compute Discrete Fourier Transform Using Naive Approach
Converting Between a List and a Set in Java
Concurrent Test Execution in Spring 5
Bootstrapping Hibernate 5 with Spring
Java Program to Find Second Smallest of n Elements with Given Complexity Constraint
Java Program to Implement Bucket Sort
The HttpMediaTypeNotAcceptableException in Spring MVC
Jackson Ignore Properties on Marshalling