1. Overview
1.概述
In this quick tutorial, we’ll explore Spring’s @RequestParam annotation and its attributes.
在这个快速教程中,我们将探讨Spring的@RequestParam注解及其属性。
Simply put, we can use @RequestParam to extract query parameters, form parameters, and even files from the request.
简单地说,我们可以使用@RequestParam从请求中提取查询参数、表单参数,甚至是文件。
2. A Simple Mapping
2.一个简单的映射
Let’s say that we have an endpoint /api/foos that takes a query parameter called id:
假设我们有一个端点/api/foos,它接受一个名为id的查询参数。
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
return "ID: " + id;
}
In this example, we used @RequestParam to extract the id query parameter.
在这个例子中,我们使用@RequestParam来提取id查询参数。
A simple GET request would invoke getFoos:
一个简单的GET请求将调用getFoos。
http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc
Next, let’s have a look at the annotation’s attributes: name, value, required, and defaultValue.
接下来,让我们看看注解的属性。name, value, required, and defaultValue。
3. Specifying the Request Parameter Name
3.指定请求参数名称
In the previous example, both the variable name and the parameter name are the same.
在前面的例子中,变量名和参数名都是一样的。
Sometimes we want these to be different, though. Or, if we aren’t using Spring Boot, we may need to do special compile-time configuration or the parameter names won’t actually be in the bytecode.
有时我们希望这些参数是不同的。或者,如果我们没有使用Spring Boot,我们可能需要进行特殊的编译时配置,否则这些参数名称实际上不会出现在字节码中。
Fortunately, we can configure the @RequestParam name using the name attribute:
幸运的是,我们可以使用name属性来配置@RequestParam的名称。
@PostMapping("/api/foos")
@ResponseBody
public String addFoo(@RequestParam(name = "id") String fooId, @RequestParam String name) {
return "ID: " + fooId + " Name: " + name;
}
We can also do @RequestParam(value = “id”) or just @RequestParam(“id”).
我们也可以做到@RequestParam(value = “id”)或者直接@RequestParam(“id”)。
4. Optional Request Parameters
4.可选的请求参数
Method parameters annotated with @RequestParam are required by default.
用@RequestParam注解的方法参数是默认需要的。
This means that if the parameter isn’t present in the request, we’ll get an error:
这意味着,如果请求中不存在该参数,我们将得到一个错误。
GET /api/foos HTTP/1.1
-----
400 Bad Request
Required String parameter 'id' is not present
We can configure our @RequestParam to be optional, though, with the required attribute:
我们可以通过@RequestParam属性将我们的@RequestParam配置为可选属性:。
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(required = false) String id) {
return "ID: " + id;
}
In this case, both:
在这种情况下,两者都是。
http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc
and
和
http://localhost:8080/spring-mvc-basics/api/foos
----
ID: null
will correctly invoke the method.
将正确调用该方法。
When the parameter isn’t specified, the method parameter is bound to null.
当没有指定参数时,方法参数被绑定为null。
4.1. Using Java 8 Optional
4.1.使用Java 8Optional
Alternatively, we can wrap the parameter in Optional:
另外,我们可以用Optional来包装这个参数。
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam Optional<String> id){
return "ID: " + id.orElseGet(() -> "not provided");
}
In this case, we don’t need to specify the required attribute.
在这种情况下,我们不需要指定required属性。
And the default value will be used if the request parameter is not provided:
而如果没有提供请求参数,将使用默认值。
http://localhost:8080/spring-mvc-basics/api/foos
----
ID: not provided
5. A Default Value for the Request Parameter
5.请求参数的默认值
We can also set a default value to the @RequestParam by using the defaultValue attribute:
我们还可以通过使用@RequestParam属性为defaultValue设置一个默认值。
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam(defaultValue = "test") String id) {
return "ID: " + id;
}
This is like required=false, in that the user no longer needs to supply the parameter:
这就像required=false,因为用户不再需要提供参数。
http://localhost:8080/spring-mvc-basics/api/foos
----
ID: test
Although, we are still okay to provide it:
虽然,我们仍然可以提供。
http://localhost:8080/spring-mvc-basics/api/foos?id=abc
----
ID: abc
Note that when we set the defaultValue attribute, required is indeed set to false.
注意,当我们设置defaultValue属性时,required确实被设置为false。
6. Mapping All Parameters
6.映射所有参数
We can also have multiple parameters without defining their names or count by just using a Map:
我们也可以有多个参数,而不需要定义它们的名字或计数,只需使用一个Map。
@PostMapping("/api/foos")
@ResponseBody
public String updateFoos(@RequestParam Map<String,String> allParams) {
return "Parameters are " + allParams.entrySet();
}
which will then reflect back any parameters sent:
然后,它将反映出任何发送的参数。
curl -X POST -F 'name=abc' -F 'id=123' http://localhost:8080/spring-mvc-basics/api/foos
-----
Parameters are {[name=abc], [id=123]}
7. Mapping a Multi-Value Parameter
7.映射一个多值参数
A single @RequestParam can have multiple values:
一个@RequestParam可以有多个值。
@GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam List<String> id) {
return "IDs are " + id;
}
And Spring MVC will map a comma-delimited id parameter:
而Spring MVC将映射一个以逗号分隔的id参数。
http://localhost:8080/spring-mvc-basics/api/foos?id=1,2,3
----
IDs are [1,2,3]
or a list of separate id parameters:
或一个单独的id参数的列表。
http://localhost:8080/spring-mvc-basics/api/foos?id=1&id=2
----
IDs are [1,2]
8. Conclusion
8.结论
In this article, we learned how to use @RequestParam.
在这篇文章中,我们学习了如何使用@RequestParam.。
The full source code for the examples can be found in the GitHub project.
示例的完整源代码可以在GitHub项目中找到。