Nhiều lập trình Spring Boot còn phân vân giữa @PathVariable khác gì với @RequestParam, và @ModelAttribute khác gì với @RequestBody. Bài viết này sẽ ví dụ để các bạn thấy rõ sự khác biệt. Tải về mã nguồn minh hoạ

1. @PathVariable khác gì với @RequestParam

  • @PathVariable là annotation để lấy tham số là một thành phần của đường dẫn. Ví dụ http://acme.com/book/5 thì 5 là thành phần dùng làm tham số
  • @RequestParam là annotation để lấy tham số là biến trong query string. Ví dụ http://acme.com/book?id=5 thì id=5

1.1 @PathVariable

@GetMapping("/book/{id}")
public String getBookByPath(@PathVariable("id") int id) {
  return "Book id = " + id;
}

1.2 @RequestParam

@GetMapping("/bookquery")
public String getBookByQuery(@RequestParam(value = "id", required = true) int id) {
  return "Book id = " + id;
}

2. @ModelAttribute khác gì với @RequestBody

Khi viết hàm hứng post request sẽ có hai khả năng:

  1. Một HTML form tạo ra post request. @ModelAttribute dùng để hứng dữ liệu dạng form.
  2. Một ứng dụng di động, hay ứng dụng web client side render kiểu React, Vue, Angular gửi post request dạng JSON. @RequestBody dùng để hứng dữ liệu dạng JSON.

Để ví dụ tôi định nghĩa một class TransferRequest như sau

import lombok.Data;
@Data
public class TransferRequest {
  private long from;
  private long to;
  private long amount;
}

2.1 @ModelAttribute hứng một post request dạng form data

@PostMapping("/transferform")
public String transferform(@ModelAttribute TransferRequest request) {
  return request.toString();
}

2.2 @RequestBody hứng một post request dạng json

@PostMapping("/transferjson")
public String transferjson(@RequestBody TransferRequest request) {
   return request.toString();
}