1. 概述
在本快速教程中,我們將探討 Spring 框架中的 <em @RequestParam</em> 註解及其屬性。
簡單來説,我們可以使用 `` 來從請求中提取查詢參數、表單參數,甚至文件。
2. 一個簡單的映射
假設我們有一個端點 /api/foos ,它接受一個名為 id 的查詢參數:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
return "ID: " + id;
}在此示例中,我們使用了 @RequestParam 來提取 id 查詢參數。
一個簡單的 GET 請求會調用 getFoos。
http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc接下來,讓我們來查看標註的屬性:`name, value, required, 和 defaultValue。
3. 指定請求參數名稱
在之前的示例中,變量名和參數名稱都是相同的。
但有時我們希望它們不同。 或者,如果我們不使用 Spring Boot,則可能需要進行編譯時配置,否則參數名稱實際上不會出現在字節碼中。
幸運的是,我們可以使用 @RequestParam 的 name 屬性來配置名稱:
@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) {
return "ID: " + fooId + " Name: " + name;
}我們還可以使用 @RequestParam(value = “id”),或者僅僅使用 @RequestParam(“id”).
4. 可選請求參數
使用@RequestParam註解的方法參數默認是必需的。
這意味着如果請求中缺少該參數,將會導致錯誤:
GET /api/foos HTTP/1.1
-----
400 Bad Request
Required String parameter 'id' is not present我們可以配置我們的 為可選的,通過使用 屬性:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false) String id) {
return "ID: " + id;
}在這種情況下,以下兩者:
http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc並且
http://localhost:8080/spring-mvc-basics/api/foos
----
ID: null將正確地調用該方法。
當參數未指定時,方法參數將綁定到 null。
4.1. 使用 Java 8 的 Optional
或者,我們可以將參數包裹在 Optional 中:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam Optional<String> id){
return "ID: " + id.orElseGet(() -> "not provided");
}在這種情況下,我們不需要指定 required 屬性。
如果未提供請求參數,則將使用默認值:
http://localhost:8080/spring-mvc-basics/api/foos
----
ID: not provided5. 請求參數的默認值
我們還可以通過使用 defaultValue 屬性,為 @RequestParam 設置默認值:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(defaultValue = "test") String id) {
return "ID: " + id;
}這類似於不需指定參數,用户不再需要提供該參數:
http://localhost:8080/spring-mvc-basics/api/foos
----
ID: test儘管如此,我們仍然可以提供它:
http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc請注意,當我們設置 defaultValue 屬性時,required 屬性確實被設置為 false。
6. 映射所有參數
我們還可以擁有多個參數,而無需定義它們的名稱,或者僅使用<em>Map</em>進行計數:
@PostMapping("/api/foos")
@ResponseBody
public String updateFoos(@RequestParam Map<String,String> allParams) {
return "Parameters are " + allParams.entrySet();
}這將會反向反映任何發送的參數:
curl -X POST -F 'name=abc' -F 'id=123' http://localhost:8080/spring-mvc-basics/api/foos
-----
Parameters are {[name=abc], [id=123]}7. 映射多值參數
單個 @RequestParam 可以有多個值:
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
return "IDs are " + id;
}並且 Spring MVC 會將逗號分隔的 參數映射到相應的對象:
http://localhost:8080/spring-mvc-basics/api/foos?id=1,2,3
----
IDs are [1,2,3]或一個由單獨的id參數組成的列表:
http://localhost:8080/spring-mvc-basics/api/foos?id=1&id=2
----
IDs are [1,2]8. 結論
在本文中,我們學習瞭如何使用 @RequestParam。