Apache HttpClient Example – CloseableHttpClient

Filed Under: Java

Apache HttpClient can be used to send HTTP requests from client code to server. In our last tutorial, we saw how to use HttpURLConnection to perform GET and POST HTTP request operations from java program itself. Today we will take the same example project but use Apache HttpClient to perform GET and POST request operations.

Apache HttpClient

apache httpclient, httpclient example, httpclient java, apache httpclient example, closeablehttpclient

For the sake of understanding the GET and POST request details, I would strongly suggest you to have a look at the earlier example too. Apache HttpClient is very widely used for sending HTTP requests from java program itself. If you are using Maven, then you can add below dependencies and it will include all other required dependencies for using Apache HttpClient.


<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.4</version>
</dependency>

However if you are not using Maven, then need to add following jars in your project build path for it to work.

  1. httpclient-4.4.jar
  2. httpcore-4.4.jar
  3. commons-logging-1.2.jar
  4. commons-codec-1.9.jar

If you are using some other version of Apache HttpClient and not using Maven, then just create a temporary Maven project to get the list of compatible jars, as shown in image below.

Apache HttpClient, HttpClient example

Now just copy the jars to your project lib directory, it will save you from any compatibility issues as well as it will save time in finding jars and downloading from internet.

Now that we have all the required dependencies, below are the steps for using Apache HttpClient to send GET and POST requests.

  1. Create instance of CloseableHttpClient using helper class HttpClients.
  2. Create HttpGet or HttpPost instance based on the HTTP request type.
  3. Use addHeader method to add required headers such as User-Agent, Accept-Encoding etc.
  4. For POST, create list of NameValuePair and add all the form parameters. Then set it to the HttpPost entity.
  5. Get CloseableHttpResponse by executing the HttpGet or HttpPost request.
  6. Get required details such as status code, error information, response html etc from the response.
  7. Finally close the apache HttpClient resource.

Below is the final program we have showing how to use Apache HttpClient for performing HTTP GET and POST requests in a java program itself.


package com.journaldev.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;

public class ApacheHttpClientExample {

	private static final String USER_AGENT = "Mozilla/5.0";

	private static final String GET_URL = "http://localhost:9090/SpringMVCExample";

	private static final String POST_URL = "http://localhost:9090/SpringMVCExample/home";

	public static void main(String[] args) throws IOException {
		sendGET();
		System.out.println("GET DONE");
		sendPOST();
		System.out.println("POST DONE");
	}

	private static void sendGET() throws IOException {
		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpGet httpGet = new HttpGet(GET_URL);
		httpGet.addHeader("User-Agent", USER_AGENT);
		CloseableHttpResponse httpResponse = httpClient.execute(httpGet);

		System.out.println("GET Response Status:: "
				+ httpResponse.getStatusLine().getStatusCode());

		BufferedReader reader = new BufferedReader(new InputStreamReader(
				httpResponse.getEntity().getContent()));

		String inputLine;
		StringBuffer response = new StringBuffer();

		while ((inputLine = reader.readLine()) != null) {
			response.append(inputLine);
		}
		reader.close();

		// print result
		System.out.println(response.toString());
		httpClient.close();
	}

	private static void sendPOST() throws IOException {

		CloseableHttpClient httpClient = HttpClients.createDefault();
		HttpPost httpPost = new HttpPost(POST_URL);
		httpPost.addHeader("User-Agent", USER_AGENT);

		List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
		urlParameters.add(new BasicNameValuePair("userName", "Pankaj Kumar"));

		HttpEntity postParams = new UrlEncodedFormEntity(urlParameters);
		httpPost.setEntity(postParams);

		CloseableHttpResponse httpResponse = httpClient.execute(httpPost);

		System.out.println("POST Response Status:: "
				+ httpResponse.getStatusLine().getStatusCode());

		BufferedReader reader = new BufferedReader(new InputStreamReader(
				httpResponse.getEntity().getContent()));

		String inputLine;
		StringBuffer response = new StringBuffer();

		while ((inputLine = reader.readLine()) != null) {
			response.append(inputLine);
		}
		reader.close();

		// print result
		System.out.println(response.toString());
		httpClient.close();

	}

}

When we run above program, we get similar output html as received in the browser.


GET Response Status:: 200
<html><head>	<title>Home</title></head><body><h1>	Hello world!  </h1><P>  The time on the server is March 7, 2015 1:01:22 AM IST. </P></body></html>
GET DONE
POST Response Status:: 200
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>User Home Page</title></head><body><h3>Hi Pankaj Kumar</h3></body></html>
POST DONE

That’s all for Apache HttpClient example, it contains a lot of utility methods that you can use. So I would suggest you to check them out for better understanding.

Comments

  1. Danny says:

    FYI:

    HttpEntity postParams = new UrlEncodedFormEntity(urlParameters);

    maybe we need to utf-8 encoding for post parameters, then we can code like this:

    HttpEntity postParams = new UrlEncodedFormEntity(urlParameters, “UTF-8”);

  2. Kagabo Cedric says:

    It works but it doesn’t redirect to the URL entered how to make it redirect to to the URL that was entered

  3. Sailendra Jena says:

    Hi can anybody tell me the reason behind using this CloseableHttpClient instead of using HttpClient.? Is there any major difference between these two? Please explain me reason for this.

    Thanks,
    Sailendra Jena

  4. saikrishna rao says:

    Dear sir,

    i want to know the difference between HttpClient and HttpUrlConnection.

  5. Zach says:

    @Pankaj I added the the dependency to my pom.xml however whenever I try to call my sendGet() method I get a NoClassDefFound error for org.apache.http.client.HttpClient. Why is this happening?

  6. mangesh rode says:

    hI ,how to set timeout?

  7. Jane Norrie says:

    I’m seeing the same error as Varun Sengar.

  8. Varun Sengar says:

    I tried the Post method on eclipse and I got this error.

    Exception in thread “main” java.lang.IllegalArgumentException: Item may not be null
    at org.apache.http.util.Args.notNull(Args.java:48)
    at org.apache.http.config.RegistryBuilder.register(RegistryBuilder.java:58)
    at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:727)
    at org.apache.http.impl.client.HttpClients.createDefault(HttpClients.java:58)
    at mypackage.A.getJsonData(A.java:30)
    at mypackage.A.main(A.java:58)

    Please tell me ASAP.

    1. Pankaj says:

      Are you using the same web application as in my program? Can you check if there is any error in server side? Use Postman or some other tool to confirm that your POST is working fine.

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages