Mục lục
@RequestParam annotation được sử dụng để trích xuất dữ liệu từ query parameters, form parameters, và kể cả các tập tin từ request.
Default mapping
Mặc định, chúng ta chỉ cần khai báo @RequestParam annotation trước các tham số đầu vào của một endpoint. Spring sẽ tự động ánh xạ query parameter truyền vào tương ứng với tên và kiểu dữ liệu của tham số.
@RestController public class HelloController { @GetMapping public String hello(@RequestParam String name) { return "Hello " + name; } }
Trong ví dụ trên, mình đã sử dụng @RequestParam để ánh xạ giá trị của name trong query parameter như tham số truyền vào hello().
Giờ mình sẽ request đến server theo đường dẫn sau:
curl http://localhost:8080/?name=deft --- Hello deft
Request Parameter Name
Trong ví dụ trước, mình đã sử dụng @RequestParam mà không chỉ định bất kỳ thuộc tính nào, vì vậy tên biến của tham số đầu vào sẽ trùng với tên của request parameter . Nhiều bạn có sử dụng mặc định như vậy sẽ rất dễ gây nhầm lẫn.
Chúng ta có thể cấu hình tên của request parameter thông qua thuộc tính name mà @RequestParam cung cấp, lúc này chúng ta có thể đặt tên biến của tham số đầu vào cách tự do và có ý nghĩa hơn.
@GetMapping("/custom") public String helloCustomer(@RequestParam(name = "name") String customName) { return "Hello " + customName; }
curl http://localhost:8080/custom/?name=deft --- Hello deft
Optional Request Parameter
Các tham số được chú thích với @RequestParam mặc định phải khác NULL, nếu chúng ta truyền vào một giá trị NULL thì Spring Boot sẽ trả về một exception để thông báo lỗi.
curl http://localhost:8080/custom/ --- {"timestamp":"2020-12-22T14:36:48.849+00:00","status":400,"error":"Bad Request","message":"","path":"/custom/"}
Chúng ta có thể cấu hình các request param có thể NULL với thuộc tính required được cung cấp bởi @RequestParam annotation.
@GetMapping("/optional") public String helloOptional(@RequestParam(name = "name", required = false) String optionalName) { if (optionalName == null) { return "Hello NULL"; } return "Hello " + optionalName; }
Kết quả
curl http://localhost:8080/optional ---- Hello NULL
Có một cách khác rất hay khi phiên bản Java bạn đang sử dụng là từ 8 trở lên. Thì các bạn có thể sử dụng Optional để bap bên ngoài tham số truyền vào. Nó sẽ tương tự như việc bạn đặt required = false
@GetMapping("/optional8") public String helloOptional(@RequestParam(name = "name") Optional<String> optionalName) { if (!optionalName.isPresent()) { return "Hello NULL"; } return "Hello " + optionalName; }
Default Value Request Parameter
Nếu như việc bạn phải sử dụng Optional request parameter cộng với việc kiểm tra nếu giá trị NULL thì gán cho nó một giá trị mặc định nào đó. Thì có lẽ không phải phiền phức như vậy đâu, chúng ta chỉ cần sử dụng defaultValue để chỉ định giá trị mặc định khi request parameter có giá trị NULL.
@GetMapping("default-value") public String helloDefaultValue(@RequestParam(defaultValue = "DEFT") String name) { return "Hello " + name; }
Kết quả
curl http://localhost:8080/default-value --- Hello DEFT
Sử dụng Map với @RequestParam
Chúng ta có thể sử dụng Map với @RequestParam để ánh xạ toàn bộ các request param mà không cần chỉ định riêng lẽ.
@PostMapping("/map-all") public void mapAll(@RequestParam Map<String, Object> params) { String name = (String) params.get("name"); Integer id = Integer.valueOf((String )params.get("id")); System.out.println(name); System.out.println(id); }
Khi mình request đến http://localhost:8080/map-all
curl -X POST -F 'name=abc' -F 'id=10' http://localhost:8080/map-all
Màn hình console sẽ in ra
abc 10
Collection Parameter
Nếu một request param ở dạng một danh sách, chúng ta chỉ cần khai báo một Collection tuỳ ý đi với @RequestParam annotation. Nó sẽ giúp chúng ta chuyển sang Collection tương ứng.
@GetMapping("/ids") public void ids(@RequestParam List<String> ids) { System.out.println(ids);; }
Kết quả
curl http://localhost:8080/ids/?ids=1,2,3 --- Console: [1, 2, 3]
Kết bài
Như vậy chúng ta vừa tìm hiểu về cách sử dụng @RequestParam annotation trong Spring boot, với rất nhiều ví dụ có thể giúp bạn triển khai bất cứ một yêu cầu nào.
Sau cùng, các bạn có thể tham khảo mã nguồn mình công khai trên gitlab để tiện theo dõi và thực hành: requestparam
Nguồn tham khảo