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

Spring MVC - Phần 16 - 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);
  }

}
  • Để trả về dữ liệu cho các API web service bạn có thể dùng @ResponseBody, @RestController, trả về XML…

Ở đâ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ề.

  • Annotation @RequestBody giúp chuyển đổi dữ liệu gửi lên thành đối tượng (khi gửi request bạn sẽ gửi body gồm dữ liệu dạng JSON chứ không gửi kiểu submit form trên web)

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

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

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

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

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

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

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

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

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

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

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

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

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ư:

rest client extension

 

Okay, Done!

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

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

stackjava.com