Tạo ứng dụng Java RESTful Client với Jersey Client
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Mục tiêu của tài liệu

Trong tài liệu này tôi sẽ hướng dẫn bạn tạo ra ứng dụng Java RESTful Client sử dụng Jersey Client API để gọi tới RESTful web service.
Các ví dụ trong tài liệu này gọi tới RESTful Web service trong bài học trước, bạn có thể xem tại đây:

2- Tạo Maven Project

Đảm bảo rằng project của bạn sử dụng Java >=6, vì trong project này sẽ sử dụng các thư viện JAXB, vốn được tích hợp sẵn trong Jdk6 hoặc mới hơn.
Project Properties:
Khai báo thư viện Jersey Client:
pom.xml
<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/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.o7planning</groupId>
    <artifactId>JerseyRESTClient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>JerseyRESTClient</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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


        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
            <version>1.19.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-json -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-json</artifactId>
            <version>1.19.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
        <dependency>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-bundle</artifactId>
            <version>1.19.2</version>
        </dependency>

    </dependencies>
    
</project>

3- Model Classes

Theo mặc định Jersey API sử dụng JAXB là XML-Binding mặc định để chuyển đổi các đối tượng Java thành XML và ngược lại, bạn cần gắn các Annotation của JAXB lên các class model để chú thích cách chuyển đổi cho JAXB.

MOXy chính là JSON-Binding mặc định để Jersey chuyển đổi các đối tượng JSON thành Java và ngược lại, bạn không gần gắn các Annotation lên các class model.
 
Employee.java
package org.o7planning.jerseyrestclient.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {

   private String empNo;
   private String empName;
   private String position;

 
   // Constructor mặc định này là bắt buộc nếu có thêm cấu tử khác.
   public Employee() {

   }

   public Employee(String empNo, String empName, String position) {
       this.empNo = empNo;
       this.empName = empName;
       this.position = position;
   }

   public String getEmpNo() {
       return empNo;
   }

   public void setEmpNo(String empNo) {
       this.empNo = empNo;
   }

   public String getEmpName() {
       return empName;
   }

   public void setEmpName(String empName) {
       this.empName = empName;
   }

   public String getPosition() {
       return position;
   }

   public void setPosition(String position) {
       this.position = position;
   }


}

4- Get JSON thành String

Ví dụ dưới đây tạo một class gọi tới RESTful Web Serivce để lấy về dữ liệu dưới dạng JSON, kết quả trả về là một String.
GetJsonAsString.java
package org.o7planning.jerseyrestclient;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class GetJsonAsString {

 public static void main(String[] args) {


     // Tạo đối tượng Client
     Client client = Client.create();

     WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees/E01");

     ClientResponse response = webResource.accept("application/json").get(ClientResponse.class);


     // Trạng thái 200 là thành công
     if (response.getStatus() != 200) {
         System.out.println("Failed with HTTP Error code: " + response.getStatus());
         String error= response.getEntity(String.class);
         System.out.println("Error: "+error);
         return;
     }

     String output = response.getEntity(String.class);

     System.out.println("Output from Server .... \n");
     System.out.println(output);
 }

}

5- Get JSON thành Object

Ví dụ dưới đây Jersey Client chuyển các dữ liệu JSON thành Java Object.
GetJsonAsObject.java
package org.o7planning.jerseyrestclient;

import javax.ws.rs.core.MediaType;

import org.o7planning.jerseyrestclient.model.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

public class GetJsonAsObject {

 public static void main(String[] args) {

     ClientConfig clientConfig = new DefaultClientConfig();


     // Tạo đối tượng Client dựa trên cấu hình.
     Client client = Client.create(clientConfig);

     WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees/E01");

     Builder builder = webResource.accept(MediaType.APPLICATION_JSON) //
             .header("content-type", MediaType.APPLICATION_JSON);

     ClientResponse response = builder.get(ClientResponse.class);


     // Trạng thái 200 là thành công
     if (response.getStatus() != 200) {
         System.out.println("Failed with HTTP Error code: " + response.getStatus());
         String error= response.getEntity(String.class);
         System.out.println("Error: "+error);
         return;
     }

     System.out.println("Output from Server .... \n");

     Employee employee = (Employee) response.getEntity(Employee.class);

     System.out.println("Emp No .... " + employee.getEmpNo());
     System.out.println("Emp Name .... " + employee.getEmpName());
     System.out.println("Position .... " + employee.getPosition());

 }

}

6- Get JSON thành List

Jersey có thể chuyển đổi một JSON thành một List.
Ví dụ RESTful Web Service trả về một List các object.
@Path("/employees")
public class EmployeeService {

   // URI:
   // /contextPath/servletPath/employees
   @GET
   @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
   public List<Employee> getEmployees() {
       List<Employee> listOfCountries = EmployeeDAO.getAllEmployees();
       return listOfCountries;
   }

}
Ứng dụng Client:
GetJsonAsList.java
package org.o7planning.jerseyrestclient;

import java.util.List;

import javax.ws.rs.core.MediaType;

import org.o7planning.jerseyrestclient.model.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class GetJsonAsList {

  public static void main(String[] args) {

      ClientConfig clientConfig = new DefaultClientConfig();

      // Tạo đối tượng Client dựa trên cấu hình.
      Client client = Client.create(clientConfig);

      WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees");

      Builder builder = webResource.accept(MediaType.APPLICATION_JSON) //
              .header("content-type", MediaType.APPLICATION_JSON);

      ClientResponse response = builder.get(ClientResponse.class);


      // Trạng thái 200 là thành công
      if (response.getStatus() != 200) {
          System.out.println("Failed with HTTP Error code: " + response.getStatus());
         String error= response.getEntity(String.class);
         System.out.println("Error: "+error);
          return;
      }

      GenericType<List<Employee>> generic = new GenericType<List<Employee>>() {
          // No thing
      };

      List<Employee> list = response.getEntity(generic);

      System.out.println("Output from Server .... \n");

      for (Employee emp : list) {
          System.out.println(" --- ");
          System.out.println("Emp No .... " + emp.getEmpNo());
          System.out.println("Emp Name .... " + emp.getEmpName());
          System.out.println("Position .... " + emp.getPosition());
      }

  }

}
Chạy ví dụ:

7- Get XML thành String

GetXmlAsString.java
package org.o7planning.jerseyrestclient;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class GetXmlAsString {

  public static void main(String[] args) {


      // Tạo đối tượng Client
      Client client = Client.create();

      WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees/E01");

      ClientResponse response = webResource.accept("application/xml").get(ClientResponse.class);


      // Trạng thái 200 là thành công
      if (response.getStatus() != 200) {
          System.out.println("Failed with HTTP Error code: " + response.getStatus());
         String error= response.getEntity(String.class);
         System.out.println("Error: "+error);
          return;
      }

      String output = response.getEntity(String.class);

      System.out.println("Output from Server .... \n");
      System.out.println(output);
  }

}

8- Get XML thành Object

GetXmlAsObject.java
package org.o7planning.jerseyrestclient;

import javax.ws.rs.core.MediaType;

import org.o7planning.jerseyrestclient.model.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class GetXmlAsObject {

  public static void main(String[] args) {

      ClientConfig clientConfig = new DefaultClientConfig();

      // Tạo đối tượng Client dựa trên cấu hình.
      Client client = Client.create(clientConfig);

      WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees/E01");

      Builder builder = webResource.accept(MediaType.APPLICATION_XML) //
              .header("content-type", MediaType.APPLICATION_XML);

      ClientResponse response = builder.get(ClientResponse.class);

      // Trạng thái 200 là thành công
      if (response.getStatus() != 200) {
          System.out.println("Failed with HTTP Error code: " + response.getStatus());
         String error= response.getEntity(String.class);
         System.out.println("Error: "+error);
          return;
      }

      System.out.println("Output from Server .... \n");

      Employee employee = (Employee) response.getEntity(Employee.class);

      System.out.println("Emp No .... " + employee.getEmpNo());
      System.out.println("Emp Name .... " + employee.getEmpName());
      System.out.println("Position .... " + employee.getPosition());

  }

}

9- Get XML thành List

Ví dụ RESTful Web Service trả về một List các object.
 
@Path("/employees")
public class EmployeeService {

  // URI:
  // /contextPath/servletPath/employees
  @GET
  @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
  public List<Employee> getEmployees() {
      List<Employee> listOfCountries = EmployeeDAO.getAllEmployees();
      return listOfCountries;
  }

}
GetXmlAsList.java
package org.o7planning.jerseyrestclient;

import java.util.List;

import javax.ws.rs.core.MediaType;

import org.o7planning.jerseyrestclient.model.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class GetXmlAsList {

  public static void main(String[] args) {

      ClientConfig clientConfig = new DefaultClientConfig();

      // Tạo đối tượng Client dựa trên cấu hình.
      Client client = Client.create(clientConfig);

      WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees");

      Builder builder = webResource.accept(MediaType.APPLICATION_XML) //
              .header("content-type", MediaType.APPLICATION_XML);

      ClientResponse response = builder.get(ClientResponse.class);

      // Trạng thái 200 là thành công
      if (response.getStatus() != 200) {
          System.out.println("Failed with HTTP Error code: " + response.getStatus());
         String error= response.getEntity(String.class);
         System.out.println("Error: "+error);
          return;
      }

      GenericType<List<Employee>> generic = new GenericType<List<Employee>>() {
          // No thing
      };

      List<Employee> list = response.getEntity(generic);

      System.out.println("Output from Server .... \n");

      for (Employee emp : list) {
          System.out.println(" --- ");
          System.out.println("Emp No .... " + emp.getEmpNo());
          System.out.println("Emp Name .... " + emp.getEmpName());
          System.out.println("Position .... " + emp.getPosition());
      }

  }

}

10- Post JSON

Sử dụng POST request tới Web serivce để tạo mới tài nguyên. Ví dụ dưới đây tạo một POST request có gửi kèm theo dữ liệu JSON để yêu cầu tạo mới một Employee.
PostJsonString.java
package org.o7planning.jerseyrestclient;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class PostJsonString {

   public static void main(String[] args) {

       Client client = Client.create();

       WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees");

 
       // Dữ liệu gửi đi cùng request
       String input = "{\"empNo\":\"E01\",\"empName\":\"New Emp1\",\"position\":\"Manager\"}";

     
       ClientResponse response = webResource.type("application/json").post(ClientResponse.class, input);

       if (response.getStatus() != 200) {
           System.out.println("Failed : HTTP error code : " + response.getStatus());
         
           String error= response.getEntity(String.class);
           System.out.println("Error: "+error);
           return;
       }

       System.out.println("Output from Server .... \n");
     
       String output = response.getEntity(String.class);
     
       System.out.println(output);

   }

}
Chạy ví dụ:
Jersey Client có thể tự động chuyển đổi một đối tượng Java thành JSON hoặc XML để gửi cùng request.
PostJsonObject.java
package org.o7planning.jerseyrestclient;

import org.o7planning.jerseyrestclient.model.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class PostJsonObject {

   public static void main(String[] args) {

       Client client = Client.create();

       WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees");
 
       // Đối tượng này sẽ được chuyển thành JSON tự động
       Employee newEmp = new Employee("E05", "New Emp1", "Manager");

       ClientResponse response = webResource.type("application/json").post(ClientResponse.class, newEmp);

       if (response.getStatus() != 200) {
           System.out.println("Failed : HTTP error code : " + response.getStatus());

           String error = response.getEntity(String.class);
           System.out.println("Error: " + error);
           return;
       }

       System.out.println("Output from Server .... \n");

       String output = response.getEntity(String.class);

       System.out.println(output);

   }

}

11- Post XML

PostXmlString.java
package org.o7planning.jerseyrestclient;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class PostXmlString {

  public static void main(String[] args) {

      Client client = Client.create();

      WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees");

      // Dữ liệu gửi đi cùng request
      String input = "<employee>"//
                      + "<empNo>E05</empNo>"//
                      + "<empName>New Emp1</empName>"//
                      + "<position>Manager</position>"
                      + "</employee>";

 
        // Gửi XML và nhận XML
       ClientResponse response = webResource.type("application/xml")//
               .accept("application/xml")//
               .post(ClientResponse.class, input);

      if (response.getStatus() != 200) {
          System.out.println("Failed : HTTP error code : " + response.getStatus());

          String error = response.getEntity(String.class);
          System.out.println("Error: " + error);
          return;
      }

      System.out.println("Output from Server .... \n");

      String output = response.getEntity(String.class);

      System.out.println(output);

  }

}
Jersey Client có thể tự động chuyển đổi một đối tượng Java thành JSON hoặc XML để gửi cùng request.
 
PostXmlObject.java
package org.o7planning.jerseyrestclient;

import org.o7planning.jerseyrestclient.model.Employee;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class PostXmlObject {

   public static void main(String[] args) {

       Client client = Client.create();

       WebResource webResource = client.resource("http://localhost:8080/RESTfulCRUD/rest/employees");
 
       // Đối tượng này sẽ được chuyển thành XML tự động
       Employee newEmp = new Employee("E05", "New Emp1", "Manager");
 
       // Gửi XML và nhận XML
       ClientResponse response = webResource.type("application/xml")//
               .accept("application/xml") //
               .post(ClientResponse.class, newEmp);

       if (response.getStatus() != 200) {
           System.out.println("Failed : HTTP error code : " + response.getStatus());

           String error = response.getEntity(String.class);
           System.out.println("Error: " + error);
           return;
       }

       System.out.println("Output from Server .... \n");

       String output = response.getEntity(String.class);

       System.out.println(output);

   }

}