Hướng dẫn sử dụng @RequestParam trong Spring Boot

@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@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

https://www.baeldung.com/spring-request-param

1 1 vote
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x