Spring MVC – Phần 16 – Code ví dụ, tạo RESTful Web Service với Spring MVC
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); } }
- Để 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
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/