CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Phát triển ứng dụng RESTful Web Service trong Java với thư viện Jersey

Đăng lúc: 12:52 PM - 22/11/2023 bởi Charles Chung - 947

Trong bài này, chúng ta sẽ tìm hiểu về RESTful Web Service và các bước tạo một ứng dụng RESTful Web Service sử dụng thư viện Jersey trong Eclipse, dùng công cụ Postman để test.

Web service là gì?

Web service là tập hợp các giao thức và tiêu chuẩn mở được sử dụng để trao đổi dữ liệu giữa các ứng dụng hoặc giữa các hệ thống. Có thể hiểu như sau:

  • Là phương thức giao tiếp giữa hai thiết bị qua mạng.
  • Là ứng dụng hoặc thành phần ứng dụng để giao tiếp.
  • Là tập hợp các tiêu chuẩn hoặc giao thức để trao đổi thông tin giữa hai thiết bị hoặc ứng dụng.

Nền tảng web service cơ bản là sử dụng dữ liệu XML và giao thức HTTP. Tất cả các web service chuẩn đều hoạt động dựa trên các thành phần sau:

– SOAP (là viết tắt của Simple Object Access Protocol) – giao thức truy cập đối tượng đơn giản: SOAP là một giao thức dựa trên XML đơn giản cho phép các ứng dụng trao đổi thông tin qua HTTP.

– UDDI (Universal Description, Discovery and Integration): UDDI là một tiêu chuẩn dựa trên XML để mô tả, xuất bản và tìm kiếm các dịch vụ web.

– WSDL (Web Services Description Language) – ngôn ngữ định nghĩa web service: WSDL là một ngôn ngữ dựa trên XML để mô tả các dịch vụ web và cách truy cập chúng.

Trong Java chúng ta sử dụng thư viện Java API for XML Web Service (JAX-WS) để xây dựng các ứng dụng Webservice. Tuy nhiên đây là một công nghệ cũ và có nhiều nhược điểm không phù hợp cho các ứng dụng cần trao đổi dữ liệu lớn theo thời gian thực.

REST Web Service là gì?

RESTful web service là các dịch vụ web được xây dựng dựa trên cấu trúc Representational State Transfer(REST). Tức là nó giống như một kiến trúc, bao gồm các nguyên tắc cần tuân theo để thiết kế, xây dựng một web service. Trong kiến trúc REST mọi thứ đều được coi là tài nguyên, chúng có thể là: tệp văn bản, ảnh, trang html, video, hoặc dữ liệu động… REST server cung cấp quyền truy cập vào các tài nguyên, REST client truy cập và thay đổi các tài nguyên đó. Ở đây các tài nguyên được định danh dựa vào URI, REST sử dụng một vài đại diện để biểu diễn các tài nguyên như văn bản, JSON, XML.

Kiến trúc REST bao gồm bốn nguyên tắc cơ bản sau:

  • HTTP: Đây là giao thức quy đinh việc giao tiếp trong kiến trúc REST, giao thức này gồm 4 hành động: POST, GET, PUT, DELETE
  • Stateless: Được gọi là phi trạng thái, có nghĩa là máy chủ sẽ không lưu giữ thông tin của client mà nó giao tiếp, thông tin hoặc được giữ trên client hoặc được chuyển thành trạng thái của tài nguyên. Mỗi request lên server thì client phải đóng gói thông tin đầy đủ để thằng server hiểu được. Điểu này giúp tách biệt client ra khỏi sự thay đổi của server và hệ thống của bạn dễ phát triển,bảo trì, mở rộng vì không cần tốn công CRUD trạng thái của client.
  • URI: REST đưa ra một cấu trúc để người dùng có thể truy cập vào tài nguyên của nó thông qua các URL, các địa chỉ REST service cần phải thật trực quan đến mức đơn giản, có thể dự đoán, và dễ hiểu. Ví dụ: chỉ cần nhìn vào thanh địa chỉ URL ta có thể đoán rằng nó đang trỏ tới cái gì và cung cấp tài nguyên gì. Và để tạo ra đáp ứng yêu cầu trên thì ta nên định nghĩa URI có câu trúc giống thư mục. Loại URI này có phân cấp, có gốc là một đường dẫn đơn, các nhánh từ gốc là các đường dẫn phụ dẫn đến các các vùng service chính.
  • Format Data (html, json, text, xml…): Khi Client gửi một yêu cầu tới web service, nó thường được truyền tải dưới dạng dữ liệu mà máy tính hiểu được (XML hoặc JSON) và thông thường nhận về với hình thức tương tự từ máy chủ. Tuy nhiên Client cũng có thể chỉ định kiểu dữ liệu nhận về mà nó mong muốn (JSON, hoặc XML,..), các chỉ định này được gọi là các kiểu MIME, nó được gửi kèm trên phần HEADER của request. Một số kiểu MIME phổ biến: application/json, application/xml, application/xhtml+xml

Trong Java chúng ta sử dụng thư viện Java API for XML RESTful Web Service (JAX-RS) để xây dựng các ứng dụng RESTfule Webservice. 

Thư viện JAX-RS

Cung cấp các chức năng và API cho việc xây dựng ứng dụng với RESTful Web Services, một số các Annotation thường sử dụng:

  • @Path : xác định đường dẫn (path) để truy cập web service. Annotation @Path có thể được sử dụng ở mức class và method. Ví dụ: http://localhost:8080/RestfulJersey/products

  • @PathParam : inject các giá trị từ URL vào các tham số của phương thức. Mỗi PathParam được phân cách bởi dấu /. Ví dụ: chúng ta có PathParam là 1. http://localhost:8080/RestfulJersey/products/1
  • @QueryParam : inject các giá trị từ query string của URL vào các tham số của phương thức. QueryParam được bắt đầu sau dấu ? và được phân cách bởi dấu &. Ví dụ: chúng ta có QueryParram là page. http://localhost:8080/RestfulJersey/products?page=1
  • @FormParam : inject các giá trị từ HTML form vào các tham số của phương thức.
  • @Produces : xác định kiểu dữ liệu trả về (response).
  • @Consumes : xác định kiểu dữ liệu gửi yêu cầu (request). @Produces và @Consumes chấp nhận đối số là các chuỗi javax.ws.rs.core.MediaType. Ví dụ: MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN, …

 

Ngoài ra, còn một số Annotation tương ứng với hành động của giao thức HTTP:

  • @POST : chỉ ra rằng phương thức sau chỉ đáp ứng yêu cầu HTTP POST. Nó thường được sử dụng để tạo một tài nguyên trên Server (Create).
  • @GET : chỉ ra rằng phương thức sau chỉ đáp ứng yêu cầu HTTP GET. Nó thường được sử dụng để truy xuất một tài nguyên (Read).
  • @PUT : chỉ ra rằng phương thức sau chỉ đáp ứng yêu cầu HTTP PUT. Nó thường được sử dụng để thay đổi trạng thái một tài nguyên hoặc để cập nhật nó (Update).
  • @DELETE : chỉ ra rằng phương thức sau chỉ đáp ứng yêu cầu HTTP DELETE. Nó thường được sử dụng để huỷ bỏ hoặc xoá một tài nguyên (Delete).

Thư viện Jersey

Jersey là một thư viện Java mã nguồn mở giúp phát triển ứng dụng RESTful Web service và các ứng dụng REST Client. Jersey cài đặt các đặc tả của JAX-RS. Jersey cung cấp thư viện thực thi Resful web service trong bộ chứa servlet (Servlet Container). Khi start ứng dụng, Jersey quét tất cả các class cung cấp tài nguyên REST được đánh dấu bởi các Annotation JAX-RS. Package chứa các class REST phải đăng ký servlet với ứng dụng trong file web.xml. Ngoài ra, Jersey cũng cung cấp các API để chúng ta có thể dễ dàng viết ứng dụng Client để truy xuất các tài nguyên RESTful web service.

Tạo ứng dụng RESTfule Webservice sử dụng thư viện Jersey trong Eclipse

Bước 1: Tạo Dynamic Web Project

  • Khởi động Eclispe IDE -> vào menu File -> New -> Dynamic Web Project -> Nhập các thông số như hình dưới

  • Tiêp tục kích vào Next -> Next -> Chọn Generate web.xml deyployment desciptor như hình

Bước 2: Convert sang Maven Project

  • Kích chuột phải vào Project vừa tạo -> Configure -> Convert to Maven Project -> Finish

Bước 3: Khai báo các Maven Dependencies cần thiết

  • Mở file pom.xml và cấu hình các Maven Dependencies gồm: jersey server, gson, jaxb api

<dependencies>

<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-server -->

<dependency>

<groupId>com.sun.jersey</groupId>

<artifactId>jersey-server</artifactId>

<version>1.9</version>

</dependency>

<dependency>

<groupId>javax.xml.bind</groupId>

<artifactId>jaxb-api</artifactId>

<version>2.3.1</version>

</dependency>

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->

<dependency>

<groupId>com.google.code.gson</groupId>

<artifactId>gson</artifactId>

<version>2.8.6</version>

</dependency>

</dependencies>

 

Bước 4: Cấu hình ứng dụng Jersey Servlet

  • Mở tệp web.xml và cấu hình vào bên trong thẻ <web-app> như sau:

<!-- khai báo servlet container -->

<servlet>

<servlet-name>jerseyServlet</servlet-name>

<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

<init-param>

<param-name>com.sun.jersey.config.property.packages</param-name>

<param-value>bkap.services</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>jerseyServlet</servlet-name>

<url-pattern>/api/*</url-pattern>

</servlet-mapping>

 

Bước 5: Tạo các package và các class theo cấu trúc sau

  • Lớp bkap.entities/Product.java: (chứa thông tin sản phẩm)

package bkap.entities;

public class Product {

private String productId;

private String productName;

private float price;

private String description;

public Product() {

}

public Product(String productId, String productName, float price, String description) {

super();

this.productId = productId;

this.productName = productName;

this.price = price;

this.description = description;

}

public String getProductId() {

return productId;

}

public void setProductId(String productId) {

this.productId = productId;

}

public String getProductName() {

return productName;

}

public void setProductName(String productName) {

this.productName = productName;

}

public float getPrice() {

return price;

}

public void setPrice(float price) {

this.price = price;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

}

  • Lớp bkap.entities/Result.java (chứa thông tin kết quả trả về)

package bkap.entities;

public class Result {

private int code;

private String message;

public Result(int code, String message) {

super();

this.code = code;

this.message = message;

}

public int getCode() {

return code;

}

public void setCode(int code) {

this.code = code;

}

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

}

  • Lớp bkap.services/ProductService.java (chứa nghiệp vụ của services)

package bkap.services;

 

import java.util.ArrayList;

import java.util.List;

import javax.ws.rs.Consumes;

import javax.ws.rs.DELETE;

import javax.ws.rs.GET;

import javax.ws.rs.POST;

import javax.ws.rs.PUT;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;

import com.google.gson.Gson;

import bkap.entities.Product;

import bkap.entities.Result;

@Path(value = "/products")

public class ProductService {

private static List<Product> products = new ArrayList<>();

@GET

@Path("/")

@Produces(MediaType.APPLICATION_JSON)

public String getProducts() {

var gson = new Gson();

return gson.toJson(products);

}

@GET

@Path("/{id}")

@Produces(MediaType.APPLICATION_JSON)

public String getProduct(@PathParam("id") String id) {

var gson = new Gson();

Product p = null;

for (Product product : products) {

if (product.getProductId().equals(id))

p = product;

}

if (p != null)

return gson.toJson(p);

else

return gson.toJson(new Result(404, "Không tìm thấy sản phẩm"));

}

@POST

@Path("/")

@Produces(MediaType.APPLICATION_JSON)

@Consumes(MediaType.APPLICATION_JSON)

public String insert(String product) {

var gson = new Gson();

products.add(gson.fromJson(product, Product.class));

var result = new Result(200, "Thêm thành công");

return gson.toJson(result);

}

@PUT

@Path("/{id}")

@Produces(MediaType.APPLICATION_JSON)

@Consumes(MediaType.APPLICATION_JSON)

public String update(@PathParam("id") String id, String product) {

var gson = new Gson();

var p = gson.fromJson(product, Product.class);

if (p.getProductId().equals(id)) {

for (Product pro : products) {

if (pro.getProductId().equals(id)) {

pro.setProductName(p.getProductName());

pro.setDescription(p.getDescription());

pro.setPrice(p.getPrice());

}

}

return gson.toJson(new Result(200, "Sửa thành công"));

} else {

return gson.toJson(new Result(404, "Mã số không khớp"));

}

}

@DELETE

@Path("/{id}")

@Produces(MediaType.APPLICATION_JSON)

public String delete(@PathParam("id") String id) {

var gson = new Gson();

Product p = null;

for (Product product : products) {

if (product.getProductId().equals(id))

p = product;

}

if (p != null) {

products.remove(p);

return gson.toJson(new Result(200, "Xóa thành công"));

} else

return gson.toJson(new Result(404, "Sản phẩm không tồn tại"));

}

}

Bước 6: Run application

  • Kích chuột phải vào project chọn Run As -> Run on Server -> Tomcat v9.0
  • Mở phần mềm Postman để test

GET:

POST: 

PUT:

DELETE:

 

Video demo

 

 

Link download source code bài viết Phát triển ứng dụng RESTful Web Service trong Java với thư viện Jersey

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ