Spring @RequestParam 注解

x33g5p2x  于2022-09-25 转载在 Spring  
字(3.5k)|赞(0)|评价(0)|浏览(421)

概述

在这个快速教程中,我们将探索 Spring 的 @RequestParam 注解。

简单地说,我们可以使用 @RequestParam 从请求中提取查询参数、表单参数甚至文件。
我们将讨论如何使用 @RequestParam 及其属性。我们还将讨论 @RequestParam@PathVariable 之间的区别。

一个简单的映射

假设我们有一个端点 /api/foos,它接受一个名为 id 的查询参数:

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

在此示例中,我们使用 @RequestParam 来提取 id 查询参数。

一个简单的 GET 请求会调用 getFoos

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

接下来,让我们看看注解的属性:name、value、requireddefaultValue。

指定请求参数名称

在前面的例子中,变量名和参数名都是一样的。

虽然有时我们希望这些有所不同。 或者,如果我们不使用 Spring Boot,我们可能需要进行特殊的编译时配置,否则参数名称实际上不会在字节码中。

但好的是我们可以使用 name 属性配置 @RequestParam 名称:

@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) { 
    return "ID: " + fooId + " Name: " + name;
}

制作一个可选的请求参数

默认情况下需要使用 @RequestParam 注释的方法参数。

这意味着如果请求中不存在参数,我们将收到错误消息:

GET /api/foos HTTP/1.1
-----
400 Bad Request
Required String parameter 'id' is not present

不过,我们可以将我们的 @RequestParam 配置为可选的,使用 *required *属性:

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false) String id) { 
    return "ID: " + id;
}

在这种情况下,两者:

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

http://localhost:8080/api/foos
----
ID: null

将正确调用该方法。

未指定参数时,方法参数绑定为null

请求参数的默认值

我们还可以使用 defaultValue 属性为 @RequestParam 设置默认值:

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(defaultValue = "test") String id) {
    return "ID: " + id;
}

**这就像required=false,因为用户不再需要提供参数:

http://localhost:8080/api/foos
----
ID: test

尽管如此,我们仍然可以提供它:

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

请注意,当我们设置 *defaultValue * 属性时,required 确实设置为 false。

映射所有参数

我们也可以有多个参数而不定义它们的名称或仅使用 Map: 来计数

@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/api/foos
-----
Parameters are {[name=abc], [id=123]}

映射多值参数

单个 @RequestParam 可以有多个值:

@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
    return "IDs are " + id;
}

Spring MVC 将映射一个逗号分隔的id参数:

http://localhost:8080/api/foos?id=1,2,3
----
IDs are [1,2,3]

或单独的id参数列表:

http://localhost:8080/api/foos?id=1&id=2
----
IDs are [1,2]

@RequestParam@PathVariable

@RequestParam@PathVariable 都可用于从请求 URI 中提取值,但它们略有不同。

查询参数与 URI 路径

虽然 @RequestParams 从查询字符串中提取值,但 @PathVariables 从 URI 路径中提取值:

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

然后,我们可以根据路径进行映射:

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

对于 @RequestParam, 它将是:

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

这会给我们相同的响应,只是一个不同的 URI:

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

编码与精确值

因为 @PathVariable 从 URI 路径中提取值,所以它没有被编码。另一方面,@RequestParam 是。

使用前面的示例,ab+c 将按原样返回:

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

但是对于 a @RequestParam 请求,参数是 URL 解码的:

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

可选值

@RequestParam@PathVariable 都可以是可选的。**

从 Spring 4.3.3 开始,我们可以使用 required 属性使 @PathVariable 可选:

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

那么,我们可以这样做:

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

或者:

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

对于@RequestParam,我们还可以使用我们在上一节中看到的 required 属性。

请注意,我们在将 @PathVariable 设为可选时应小心,以避免路径冲突。

结论

在本文中,我们了解了如何使用 @RequestParam 以及 @RequestParam@PathVariable 之间的区别。

相关文章