Restful Java client with Apache HTTP client


Restful services with Jersey and Apache HTTP client


Create a new Maven Web project in eclipse (Refer Rest service Hello World project for the same)

Project structure


RestWithHttpClient_project_structure

Step 1

Update pom.xml with below dependencies

  1. <project xmlns="http://maven.apache.org/POM/4.0.0
  2.         "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4.         http://maven.apache.org/maven-v4_0_0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>RestWithHttpClient</groupId>
  7.     <artifactId>RestWithHttpClient</artifactId>
  8.     <packaging>war</packaging>
  9.     <version>0.0.1-SNAPSHOT</version>
  10.     <name>RestWithHttpClient MavenWebapp</name>
  11.     <url>http://maven.apache.org</url>
  12.  
  13. <dependencies>
  14.  
  15.       <dependency>
  16.           <groupId>junit</groupId>
  17.           <artifactId>junit</artifactId>
  18.           <version>3.8.1</version>
  19.           <scope>test</scope>
  20.       </dependency>
  21.  
  22.       <dependency>
  23.          <groupId>org.glassfish.jersey.containers</groupId>
  24.          <artifactId>jersey-container-servlet</artifactId>
  25.          <version>2.24</version>
  26.       </dependency>
  27.  
  28.      <dependency>
  29.          <groupId>javax.xml</groupId>
  30.          <artifactId>jaxb-api</artifactId>
  31.          <version>2.1</version>
  32.      </dependency>
  33.  
  34.      <dependency>
  35.          <groupId>org.apache.httpcomponents</groupId>
  36.          <artifactId>httpclient</artifactId>
  37.          <version>4.5.2</version>
  38.     </dependency>
  39.  
  40. </dependencies>
  41.  
  42. <build>
  43. <finalName>RestWithHttpClient</finalName>
  44. </build>
  45.  
  46. </project>
<project xmlns="http://maven.apache.org/POM/4.0.0
         "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>RestWithHttpClient</groupId>
    <artifactId>RestWithHttpClient</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>RestWithHttpClient MavenWebapp</name>
    <url>http://maven.apache.org</url>

<dependencies>

      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
      </dependency>

      <dependency>
         <groupId>org.glassfish.jersey.containers</groupId>
         <artifactId>jersey-container-servlet</artifactId>
         <version>2.24</version>
      </dependency>

     <dependency>
         <groupId>javax.xml</groupId>
         <artifactId>jaxb-api</artifactId>
         <version>2.1</version>
     </dependency>

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

</dependencies>

<build>
<finalName>RestWithHttpClient</finalName>
</build>

</project>

We have added dependencies for Jersey servlet,Jaxb,http client and Junit in the above pom file.

Step 2

Update web.xml file with Jersey servlet container

we have defined a special servlet called “jersey-serlvet” in web.xml and mapped it by the URL pattern /rest/*

So just like any other servlet in web application,any request matching with the given pattern i.e /rest/* will be redirected to “Jersey servelt”.

  1. <!DOCTYPEweb-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  2.                         "http://java.sun.com/dtd/web-app_2_3.dtd">
  3.  
  4. <web-app>
  5.         <display-name>Archetype Created Web Application</display-name>
  6.         <servlet>
  7.         <servlet-name>jersey-serlvet</servlet-name>
  8.         <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
  9.         <init-param>
  10.             <param-name>jersey.config.server.provider.packages</param-name>
  11.             <param-value>com.kb.rest.resource</param-value>
  12.         </init-param>
  13.         <load-on-startup>1</load-on-startup>
  14.     </servlet>
  15.  
  16.     <servlet-mapping>
  17.         <servlet-name>jersey-serlvet</servlet-name>
  18.         <url-pattern>/rest/*</url-pattern>
  19.     </servlet-mapping>
  20. </web-app>
<!DOCTYPEweb-appPUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                        "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
        <display-name>Archetype Created Web Application</display-name>
        <servlet>
		<servlet-name>jersey-serlvet</servlet-name>
		<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>jersey.config.server.provider.packages</param-name>
			<param-value>com.kb.rest.resource</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>jersey-serlvet</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>
</web-app>

We have also provided the package of java classes(to be qualified as Rest services) under init-param tag.

This package will be considered by Jersey servlet container to identify the actual service when the request comes in.

Step 3

Create a Resource class as below

  1. package com.kb.rest.resource;
  2.  
  3. import java.util.List;
  4. import javax.ws.rs.Consumes;
  5. import javax.ws.rs.GET;
  6. import javax.ws.rs.POST;
  7. import javax.ws.rs.Path;
  8. import javax.ws.rs.Produces;
  9. import javax.ws.rs.core.MediaType;
  10. import javax.ws.rs.core.Response;
  11.  
  12. import com.kb.model.User;
  13. import com.kb.service.UserService;
  14.  
  15. @Path("/userInfo")
  16. public class UserResource {
  17.     UserService userService = new UserService();
  18.  
  19.     @POST
  20.     @Consumes(MediaType.APPLICATION_XML)
  21.     public Response createUser(User user) {
  22.         userService.createUser(user);
  23.         String result = "User created with " + "ID: "+user.getId();
  24.         return Response.status(201).entity(result).build();
  25.  
  26.     }
  27.  
  28.     @GET
  29.     @Produces(MediaType.APPLICATION_XML)
  30.     public List<User> getAllUsers() {
  31.         List<User> userList = userService.getAllUsers();
  32.         return userList;
  33.     }
  34. }
package com.kb.rest.resource;

import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.kb.model.User;
import com.kb.service.UserService;

@Path("/userInfo")
public class UserResource {
	UserService userService = new UserService();

	@POST
	@Consumes(MediaType.APPLICATION_XML)
	public Response createUser(User user) {
		userService.createUser(user);
		String result = "User created with " + "ID: "+user.getId();
		return Response.status(201).entity(result).build();

	}

	@GET
	@Produces(MediaType.APPLICATION_XML)
	public List<User> getAllUsers() {
		List<User> userList = userService.getAllUsers();
		return userList;
	}
}


@Path(“/userInfo”)


This annotation helps to map the request URL to appropriate Rest service.

So any request with /userInfo (relative to the base URI) will be mapped to UserResource.

This annotation should be used either at the class level or at the method level.

@GET


This annotation specifies that only GET requests will be accepted by this method.

This annotation will be used at the method level.


@POST


This annotation specifies that only POST requests will be accepted by this method.

This annotation will be used at the method level.


@Consumes(MediaType.APPLICATION_XML)


This annotation is used to specify the representation of a data (MIME type) that the service can accept from the client.

This annotation can be used either at the class level or at the method level.

If this annotation is applied at the class level,all the methods in the class will accept the same MIME type data from client by default.

However we can override this at the method level with different MIME type.

We can also specify multiple MIME types as below@Consumes({“application/xml”, “application/json”})

Note:

We should Use application/xml for the xml to be processed by programs and we should use text/xml if we are using xml for human reading purposes.


@Produces(MediaType.APPLICATION_XML)


This annotation is used to specify the representation of a data (MIME type) that the service can produce and send it to client.

This annotation can be used either at the class level or at the method level.

If this annotation is applied at the class level,all the methods in the class can produce the same MIME type data by default.

However we can override this at the method level with different MIME type.

We can also specify multiple MIME types as below@Produces({“application/xml”, “application/json”})

Step 4

Create the business Service class as below

  1. package com.kb.service;
  2.  
  3. import java.util.List;
  4.  
  5. import com.kb.dao.UserDAO;
  6. import com.kb.model.User;
  7.  
  8. public class UserService {
  9.     UserDAO userDao = new UserDAO();
  10.  
  11.     public List<User> getAllUsers() {
  12.         List<User> userList = userDao.getAllUsers();
  13.         return userList;
  14.     }
  15.  
  16.     public void createUser(User user) {
  17.         userDao.createUser(user);
  18.     }
  19.  
  20. }
package com.kb.service;

import java.util.List;

import com.kb.dao.UserDAO;
import com.kb.model.User;

public class UserService {
	UserDAO userDao = new UserDAO();

	public List<User> getAllUsers() {
		List<User> userList = userDao.getAllUsers();
		return userList;
	}

	public void createUser(User user) {
		userDao.createUser(user);
	}

}


Step 5

Create a DAO class as below

  1. package com.kb.dao;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6.  
  7. import com.kb.model.User;
  8.  
  9. //Just to avoid DB calls in this example, Assume below data is interacting with DB
  10. public class UserDAO {
  11.     static HashMap<String, User> usersMap = new HashMap<String, User>();
  12.  
  13.     public UserDAO() {
  14.             User user1 = new User();
  15.             user1.setId("1");
  16.             user1.setAge(20);
  17.             user1.setName("raj");
  18.            
  19.             User user2 = new User();
  20.             user2.setId("2");
  21.             user2.setAge(21);
  22.             user2.setName("ram");
  23.            
  24.             usersMap.put("1", user1);
  25.             usersMap.put("2", user2);
  26.     }
  27.  
  28.     public List<User> getAllUsers() {
  29.  
  30.         List<User> userList = new ArrayList<User>(usersMap.values());
  31.         return userList;
  32.     }
  33.  
  34.     public void createUser(User user) {
  35.         usersMap.put(user.getId(), user);
  36.     }
  37.  
  38. }
package com.kb.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.kb.model.User;

//Just to avoid DB calls in this example, Assume below data is interacting with DB
public class UserDAO {
	static HashMap<String, User> usersMap = new HashMap<String, User>();

	public UserDAO() {
			User user1 = new User();
			user1.setId("1");
			user1.setAge(20);
			user1.setName("raj");
			
			User user2 = new User();
			user2.setId("2");
			user2.setAge(21);
			user2.setName("ram");
			
			usersMap.put("1", user1);
			usersMap.put("2", user2);
	}

	public List<User> getAllUsers() {

		List<User> userList = new ArrayList<User>(usersMap.values());
		return userList;
	}

	public void createUser(User user) {
		usersMap.put(user.getId(), user);
	}

}


Create the classes for java client

Step 6

Client to make GET call

  1. package com.kb.rest.client;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6.  
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.client.ClientProtocolException;
  9. import org.apache.http.client.methods.HttpGet;
  10. import org.apache.http.impl.client.CloseableHttpClient;
  11. import org.apache.http.impl.client.HttpClients;
  12.  
  13. publicclass RestGetClient {
  14.     publicstaticvoid main(String[] args) {
  15.        
  16.         try {
  17.             CloseableHttpClient  httpClient = HttpClients.createDefault();
  18.             HttpGet getRequest = new HttpGet(
  19.                 "http://localhost:8080/RestWithHttpClient/rest/userInfo");
  20.             getRequest.addHeader("accept", "application/xml");
  21.             HttpResponse response = httpClient.execute(getRequest);
  22.             if (response.getStatusLine().getStatusCode() != 200) {
  23.                 thrownew RuntimeException("Request Processing Failed : HTTP error code : "
  24.                    + response.getStatusLine().getStatusCode());
  25.             }
  26.  
  27.             BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().
  28.                                                                                                    getContent())));
  29.  
  30.             String output;
  31.             System.out.println("Output received from Rest service ....");
  32.             while ((output = br.readLine()) != null) {
  33.                 System.out.println(output);
  34.             }
  35.  
  36.             httpClient.close();
  37.  
  38.           } catch (ClientProtocolException e) {
  39.  
  40.             e.printStackTrace();
  41.  
  42.           } catch (IOException e) {
  43.  
  44.             e.printStackTrace();
  45.           }
  46.        
  47.     }
  48.  
  49. }
package com.kb.rest.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

publicclass RestGetClient {
	publicstaticvoid main(String[] args) {
		
		try {
			CloseableHttpClient  httpClient = HttpClients.createDefault();
			HttpGet getRequest = new HttpGet(
				"http://localhost:8080/RestWithHttpClient/rest/userInfo");
			getRequest.addHeader("accept", "application/xml");
			HttpResponse response = httpClient.execute(getRequest);
			if (response.getStatusLine().getStatusCode() != 200) {
				thrownew RuntimeException("Request Processing Failed : HTTP error code : "
				   + response.getStatusLine().getStatusCode());
			}

			BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().
                                                                                                   getContent())));

			String output;
			System.out.println("Output received from Rest service ....");
			while ((output = br.readLine()) != null) {
				System.out.println(output);
			}

			httpClient.close();

		  } catch (ClientProtocolException e) {

			e.printStackTrace();

		  } catch (IOException e) {

			e.printStackTrace();
		  }
		
	}

}



Step 7

Client to make POST call

  1. package com.kb.rest.client;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.MalformedURLException;
  6.  
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.HttpStatus;
  9. import org.apache.http.client.methods.HttpPost;
  10. import org.apache.http.entity.StringEntity;
  11. import org.apache.http.impl.client.CloseableHttpClient;
  12. import org.apache.http.impl.client.HttpClients;
  13.  
  14. public class RestPostClient {
  15.     public static void main(String[] args) {
  16.         try {
  17.             CloseableHttpClient  httpClient = HttpClients.createDefault();
  18.  
  19.             HttpPost postRequest = new HttpPost(
  20.                     "http://localhost:8080/RestWithHttpClient/rest/userInfo");
  21.  
  22.             String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
  23.             String input = xmlHeader+"<User><id>1</id><name>Roy Thomas Fielding</name><age>51</age>  
  24.                                                                                                         </User>";
  25.             StringEntity inputEntity = new StringEntity(input);
  26.             inputEntity.setContentType("application/xml");
  27.             postRequest.setEntity(inputEntity);
  28.             System.out.println(inputEntity);
  29.                 HttpResponse response = httpClient.execute(postRequest);
  30.                 if (response.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED) {
  31.                     throw new RuntimeException("Request Processing Failed : HTTP error code : "
  32.                                      + response.getStatusLine().getStatusCode());
  33.                 }
  34.  
  35.                 BufferedReader br = new BufferedReader(
  36.                                 new InputStreamReader((response.getEntity().getContent())));
  37.  
  38.                 String output;
  39.                 System.out.println("Output received from Rest service ....");
  40.                 while ((output = br.readLine()) != null) {
  41.                     System.out.println(output);
  42.                 }
  43.                 httpClient.close();
  44.           } catch (MalformedURLException e) {
  45.  
  46.             e.printStackTrace();
  47.  
  48.           } catch (IOException e) {
  49.  
  50.             e.printStackTrace();
  51.  
  52.          }
  53.     }
  54.  
  55. }
package com.kb.rest.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class RestPostClient {
	public static void main(String[] args) {
		try {
			CloseableHttpClient  httpClient = HttpClients.createDefault();

			HttpPost postRequest = new HttpPost(
					"http://localhost:8080/RestWithHttpClient/rest/userInfo");

			String xmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
			String input = xmlHeader+"<User><id>1</id><name>Roy Thomas Fielding</name><age>51</age>  
                                                                                                         </User>";
			StringEntity inputEntity = new StringEntity(input);
			inputEntity.setContentType("application/xml");
			postRequest.setEntity(inputEntity);
			System.out.println(inputEntity);
				HttpResponse response = httpClient.execute(postRequest);
				if (response.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED) {
					throw new RuntimeException("Request Processing Failed : HTTP error code : "
							         + response.getStatusLine().getStatusCode());
				}

				BufferedReader br = new BufferedReader(
		                        new InputStreamReader((response.getEntity().getContent())));

				String output;
				System.out.println("Output received from Rest service ....");
				while ((output = br.readLine()) != null) {
					System.out.println(output);
				}
				httpClient.close();
		  } catch (MalformedURLException e) {

			e.printStackTrace();

		  } catch (IOException e) {

			e.printStackTrace();

		 }
	}

}
Step 8

Build the war file and deploy in Tomcat

Step 9

Check the output

Run RestGetClient class

Output appears as below

RestWithHttpClient_get_output

Now run RestPostClient class

Output appears as below

RestWithHttpClient_post_output

Download this project RestWithHttpClient.zip

About the Author

Founder of javainsimpleway.com
I love Java and open source technologies and very much passionate about software development.
I like to share my knowledge with others especially on technology 🙂
I have given all the examples as simple as possible to understand for the beginners.
All the code posted on my blog is developed,compiled and tested in my development environment.
If you find any mistakes or bugs, Please drop an email to kb.knowledge.sharing@gmail.com

Connect with me on Facebook for more updates

Share this article on