Sự khác nhau giữa @RequestParam với @PathVariable trong Spring

Trong Spring, @RequestParam@PathVariable annotation đều được sử dụng để trích xuất dữ liệu từ request URL. Nếu chỉ vừa mới tiếp xúc thì có thể chúng ta sẽ nghỉ chúng đều có chung mục đích sử dụng cho nên dùng cái nào cũng được, nhưng thật ra chúng có một điểm khác biệt rất lớn về cách sử dụng mà chúng ta sẽ tìm hiểu trong bài viết này.

Query parameter và URL path

Như lúc nảy mình đã nói thì 2 thằng @RequestParam với @PathVariable có mục đích sử dụng khác nhau. @RequestParam được dùng để trích xuất dữ liệu từ request query. @PathVariable thì được dùng để trích xuất dữ liệu từ URL path.

Để phân biệt giữa request query và url path thì mình có ví dụ sau đây:

@RestController
public class UserController {
    
    @Autowire
    private UserRepository. userRepo;
    
    @PostMapping("/user/{id}")
    public User getUserById (@PathVariable String id)) {
        return userRepo.findById(id);
    }
}

Với Endpoint trên, chúng ta đã đặt nó theo mẫu của URL path, chuỗi {id} chỉ ra rằng giá trị đằng sau “/user” là mã định danh ID của user. Vì vậy chúng ta hoàn toàn có thể sử dụng @PathVariable để trích xuất ID từ URL path.

Chúng ta có thể sử dụng mẫu HTTP request dưới đây để kiểm tra.

http://localhost:8080/user/1

Chúng ta sẽ làm một ví dụ tương tự như tính năng ở trên nhưng dùng @RequestParam. 

@RestController
public class UserController {
    
    @Autowire
    private UserRepository. userRepo;
    
    @PostMapping("/user")
    public User getUserById (@RequestParam String id)) {
        return userRepo.findById(id);
    }
}

Trong đó id là một thuộc tính trong request query với đầu vào là 1. Chúng ta có thể API trên bằng HTTP request sau:

http://localhost:8080/user?id=1

Tóm lược

Qua bài viết này, hy vọng các bạn có thể hiểu được cách sử dụng của 2 thằng này. Trong một ứng dụng REST API chúng ta cần kết hợp sử dụng @PathVariable và @RequestPram để đạt được những tiêu chuẩn của một  Rest API endpoint.

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