Spring @RequestParam so với @PathVariable Annotations

1. Khái quát chung

Trong hướng dẫn nhanh này, chúng ta sẽ khám phá sự khác biệt giữa các chú thích @RequestParam@PathVariable của Spring .

@RequestParam@PathVariable đều có thể được sử dụng để trích xuất các giá trị từ URI yêu cầu, nhưng chúng hơi khác một chút.

2. Tham số truy vấn so với Đường dẫn URI

Trong khi @RequestParam s trích xuất giá trị từ chuỗi truy vấn, @PathVariables trích xuất giá trị từ đường dẫn URI:

@GetMapping("/foos/{id}") @ResponseBody public String getFooById(@PathVariable String id) { return "ID: " + id; }

Sau đó, chúng ta có thể lập bản đồ dựa trên đường dẫn:

//localhost:8080/foos/abc ---- ID: abc

Và đối với @RequestParam, nó sẽ là:

@GetMapping("/foos") @ResponseBody public String getFooByIdUsingQueryParam(@RequestParam String id) { return "ID: " + id; }

Điều này sẽ cung cấp cho chúng tôi cùng một phản hồi, chỉ là một URI khác:

//localhost:8080/foos?id=abc ---- ID: abc

3. Giá trị được mã hóa so với giá trị chính xác

@PathVariable đang trích xuất các giá trị từ đường dẫn URI nên nó không được mã hóa. Mặt khác, @RequestParam là.

Sử dụng ví dụ trước, ab + c sẽ trả về nguyên trạng:

//localhost:8080/foos/ab+c ---- ID: ab+c

Nhưng đối với yêu cầu @RequestParam , tham số là URL được giải mã:

//localhost:8080/foos?id=ab+c ---- ID: ab c

4. Giá trị tùy chọn

Cả @RequestParam@PathVariable đều có thể là tùy chọn.

Chúng ta có thể làm cho @PathVariable là tùy chọn bằng cách sử dụng thuộc tính bắt buộc bắt đầu với Spring 4.3.3:

@GetMapping({"/myfoos/optional", "/myfoos/optional/{id}"}) @ResponseBody public String getFooByOptionalId(@PathVariable(required = false) String id){ return "ID: " + id; }

Sau đó, chúng ta có thể làm:

//localhost:8080/myfoos/optional/abc ---- ID: abc 

hoặc là:

//localhost:8080/myfoos/optional ---- ID: null

Đối với @RequestParam , chúng ta cũng có thể sử dụng thuộc tính bắt buộc .

Lưu ý rằng chúng ta nên cẩn thận khi đặt @PathVariable là tùy chọn, để tránh xung đột trong đường dẫn.

5. Kết luận

Trong bài viết này, chúng tôi đã tìm hiểu sự khác biệt giữa @RequestParam@PathVariable .

Bạn có thể tìm thấy mã nguồn đầy đủ cho các ví dụ trên GitHub.