在这个快速教程中,我们将探讨Spring的@RequestParam和@PathVariable注释之间的差异。
@RequestParam和@PathVariable都可用于从请求 URI 中提取值,但它们略有不同。
从查询字符串@RequestParams 个数据提取值时,@PathVariable从 URI 路径中提取数据提取值:
- @GetMapping("/foos/{id}")
- @ResponseBody
- public String getFooById(@PathVariable String id) {
- return "ID: " + id;
- }
Copy
然后我们可以根据路径进行映射:
- http://localhost:8080/spring-mvc-basics/foos/abc
- ----
- ID: abc
Copy
对于@RequestParam,它将是:
- @GetMapping("/foos")
- @ResponseBody
- public String getFooByIdUsingQueryParam(@RequestParam String id) {
- return "ID: " + id;
- }
Copy
这将给我们相同的响应,只是一个不同的URI:
- http://localhost:8080/spring-mvc-basics/foos?id=abc
- ----
- ID: abc
Copy
由于@PathVariable从 URI 路径中提取值,因此未对其进行编码。另一方面,@RequestParam是编码的。
使用前面的示例,ab+c 将按原样返回:
- http://localhost:8080/spring-mvc-basics/foos/ab+c
- ----
- ID: ab+c
Copy
但对于@RequestParam请求,参数是 URL 解码的:
- http://localhost:8080/spring-mvc-basics/foos?id=ab+c
- ----
- ID: ab c
Copy
@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;
- }
Copy
然后我们可以做以下两件事之一:
- http://localhost:8080/spring-mvc-basics/myfoos/optional/abc
- ----
- ID: abc
Copy
艺术
- http://localhost:8080/spring-mvc-basics/myfoos/optional
- ----
- ID: null
Copy
对于@RequestParam,我们还可以使用所需的属性。
请注意,在使@PathVariable可选时,我们应该小心,以避免路径冲突。
在本文中,我们了解了@RequestParam和@PathVariable之间的差异。
示例的完整源代码可以在 GitHub 上找到。