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.

As always, the complete source code is available over on GitHub. For HttpClient 4.x code snippets, please refer to our HttpClient 4 module.

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