知識庫 / Spring RSS 訂閱

Spring @RequestParam 與 @PathVariable 註解對比

Spring
HongKong
9
12:53 PM · Dec 06 ,2025

1. 概述

在本快速教程中,我們將探討 Spring 框架中 @RequestParam@PathVariable 註解之間的差異。

@RequestParam@PathVariable 都可以用於從請求 URI 中提取值,但它們之間存在一些差異。

2. 查詢參數與 URI 路徑

雖然 @RequestParam 從查詢字符串中提取值,但 @PathVariable 從 URI 路徑中提取值。

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

然後我們可以根據路徑進行映射:

http://localhost:8080/spring-mvc-basics/foos/abc
----
ID: abc

對於 @RequestParam,它將會是:

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

這將給我們相同的響應,只是 URI 不同:

http://localhost:8080/spring-mvc-basics/foos?id=abc
----
ID: abc

3. 編碼值與精確值

因為 @PathVariable 從 URI 路徑中提取值,因此它不會進行編碼。另一方面,@RequestParam 會進行編碼。

使用前面的示例,ab+c 將會直接返回:

http://localhost:8080/spring-mvc-basics/foos/ab+c
----
ID: ab+c

但是對於一個使用 @RequestParam 參數的請求,參數將被 URL 解碼。

http://localhost:8080/spring-mvc-basics/foos?id=ab+c
----
ID: ab c

4. 可選值

@RequestParam@PathVariable 都可以設置為可選。

通過在 Spring 4.3.3 及更高版本中使用 屬性,可以使 @PathVariable 設置為可選。

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

然後我們可以選擇以下方式:

http://localhost:8080/spring-mvc-basics/myfoos/optional/abc
----
ID: abc

或:

http://localhost:8080/spring-mvc-basics/myfoos/optional
----
ID: null

對於 @RequestParam,我們也可以使用 required 屬性。

請注意,在設置 @PathVariable 為可選時,應謹慎,以避免路徑衝突。

結論

在本文中,我們學習了 @RequestParam@PathVariable 的區別。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.