STACKJAVA

Spring MVC – Phần 16 – Code ví dụ, tạo RESTful Web Service với Spring MVC

Spring MVC – Phần 16 – Code ví dụ, tạo RESTful Web Service với Spring MVC

Web Service là gì?

Giới thiệu về RESTful web service.

Spring MVC – Phần 16 – Code ví dụ, tạo RESTful Web Service với Spring MVC . Tạo 1 ứng dụng RESTful Web Service với Spring MVC. Code ví dụ chi tiết từng bước.

Code ví dụ, tạo RESTful Web Service với Spring MVC

Thư viện sử dụng

<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>stackjava.com</groupId>
  <artifactId>SpringMVCRESTful</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.3</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.3</version>
    </dependency>
  </dependencies>
</project>

Bộ thư viện jackson hỗ trợ việc chuyển đổi dữ liệu gửi lên và dữ liệu trả về sang object với json

File entity:

package stackjava.com.springmvc.restful.model;

public class User {
  private int id;
  private String name;
  private String email;
  private String address;

  // getter - setter

}

File Controller:

package stackjava.com.springmvc.restful.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class BaseController {

  @RequestMapping("/")
  public String index() {
    return "index";
  }

}
package stackjava.com.springmvc.restful.controller;

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

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import stackjava.com.springmvc.restful.model.User;

@RestController
public class UserRestController {

  public static HashMap<Integer, User> mapUser = new HashMap<Integer, User>();
  static {
    mapUser.put(1, new User(1, "Nam", "abc@gmail.com", "Ha Noi - Viet Nam"));
    mapUser.put(2, new User(2, "Darius", "darius@gmail.com", "New York - USA"));
    mapUser.put(3, new User(3, "Rooney", "rooney@gmail.com", "London - England"));
    mapUser.put(4, new User(4, "Kagawa", "kagawa@yahoo.com", "Tokyo - Japan"));
  }
  

  /* ---------------- GET ALL USER ------------------------ */
  @RequestMapping(value = "/users", method = RequestMethod.GET)
  public ResponseEntity<List<User>> getAllUser() {
    List<User> listUser = new ArrayList<User>(mapUser.values());
    return new ResponseEntity<List<User>>(listUser, HttpStatus.OK);
  }

  
  /* ---------------- GET USER BY ID ------------------------ */
  @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
  public ResponseEntity<Object> getUserById(@PathVariable int id) {
    User user = mapUser.get(id);
    if (user != null) {
      return new ResponseEntity<Object>(user, HttpStatus.OK);
    }
    return new ResponseEntity<Object>("Not Found User", HttpStatus.NO_CONTENT);
  }

  
  /* ---------------- CREATE NEW USER ------------------------ */
  @RequestMapping(value = "/users", method = RequestMethod.POST)
  public ResponseEntity<String> createUser(@RequestBody User user) {
    if (mapUser.containsKey(user.getId())) {
      return new ResponseEntity<String>("User Already Exist!", HttpStatus.CONFLICT);
    }
    mapUser.put(user.getId(), user);
    return new ResponseEntity<String>("Created!", HttpStatus.CREATED);
  }

  
  /* ---------------- DELETE USER ------------------------ */
  @RequestMapping(value = "/users/{id}", method = RequestMethod.DELETE)
  public ResponseEntity<String> deleteUserById(@PathVariable int id) {
    User user = mapUser.get(id);
    if (user == null) {
      return new ResponseEntity<String>("Not Found User", HttpStatus.OK);
    }
    
    mapUser.remove(id);
    return new ResponseEntity<String>("Deleted!", HttpStatus.OK);
  }

  
  /* ---------------- UPDATE USER ------------------------ */
  @RequestMapping(value = "/users", method = RequestMethod.PUT)
  public ResponseEntity<String> updateUser(@RequestBody User user) {
    User oldUser = mapUser.get(user.getId());
    if (oldUser == null) {
      return new ResponseEntity<String>("Not Found User", HttpStatus.NO_CONTENT);
    }
    
    // replace old user by new user.
    mapUser.put(user.getId(), user);
    return new ResponseEntity<String>("Updated!", HttpStatus.OK);
  }

}

Ở đây mình trả về ResponseEntity + thư viện jacson, nó sẽ giúp tự chuyển đổi data sang dạng JSON và kèm theo http status code khi trả về.

File Spring Config:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

  <context:component-scan
    base-package="stackjava.com.springmvc.restful.controller" />
  <mvc:annotation-driven />
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
      <value>/WEB-INF/views/jsp/</value>
    </property>
    <property name="suffix">
      <value>.jsp</value>
    </property>
  </bean>

</beans>

Lưu ý nhớ khai báo thẻ <mvc:annotation-driven /> khi áp dụng restful web service (trả về ResponseEntity, convert đối tượng)

File view:

<html>
<head>
</head>
<body>
  <h1>Demo Spring MVC RESTful Web Service</h1> <br/>
  <a href="users">/users</a> <br />
  <a href="users/1">/users/1</a> <br />
</body>
</html>

Demo:

Ở đây mình dùng postman extension trên chrome để gửi các request thêm, sửa, xóa, update đối tượng user.

(Xem thêm: Postman là gì? Cài đặt, gửi request API với Postman)

Cài đặt postman extension:

Truy cập link:

https://chrome.google.com/webstore/search/postman?utm_source=chrome-ntp-icon&_category=extensions

Gửi request lấy về tất cả các đối tượng user

Gửi request lấy về đối tượng user có id = 1

Gửi request lấy về đối tượng user có id = 9 (chưa tồn tại)

Gửi request xóa đối tượng user có id = 1

Gửi request tạo mới đối tượng với id = 10

Gửi request update lại đối tượng có id = 2

Gửi request lấy tất cả đối tượng user sau khi thêm, sửa xóa:

Ngoài postman các bạn cũng có thể dùng các rest client khác để gửi request như:

 

Okay, Done!

Download code ví dụ trên tại đây

References: https://spring.io/guides/gs/rest-service/