目录
[1. @RequestBody](#1. @RequestBody)
[2. @PathVariable](#2. @PathVariable)
[3. @RequestParam](#3. @RequestParam)
[4. 总结与对比](#4. 总结与对比)
[5. 总结](#5. 总结)
在 Spring 中,@RequestBody
、@PathVariable
和 @RequestParam
是常用的注解,用于处理请求中的不同类型的参数。每个注解都有其独特的用途和使用场景,下面将详细解释这三个注解,并给出示例及解释。
1. @RequestBody
用途:
@RequestBody
注解用于将请求的 请求体(Body) 中的数据绑定到方法参数。通常用于接收客户端发送的 JSON、XML 或其他类型的数据。- 主要用于 POST、PUT、PATCH 等 HTTP 方法,这些方法通常会有请求体。
常见场景:
- 接收客户端发送的 JSON 格式数据并将其转换为 Java 对象。
- 配合
@RestController
使用时,自动返回数据并将其转换为 JSON。
示例代码:
java
@RestController
@RequestMapping("/api")
public class PersonController {
// POST 请求,接收 JSON 格式的请求体
@PostMapping("/person")
public String createPerson(@RequestBody Person person) {
// 输出请求体中的数据
return "Person Created: " + person.getName() + ", Age: " + person.getAge();
}
}
Person
类定义如下:
java
public class Person {
private String name;
private int age;
// Getter 和 Setter 方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
-
客户端发送的 JSON 请求体如下:
{
"name": "John Doe",
"age": 30
}
Spring 会自动将请求体中的 JSON 转换为 Person
对象。
注意事项:
- 需要在 Spring 配置中启用消息转换器(默认情况下 Spring Boot 会自动配置)。
- 如果请求体的格式不正确(如格式不符合 JSON 格式),会抛出
HttpMessageNotReadableException
异常。
2. @PathVariable
用途:
@PathVariable
注解用于从 URL 的路径中提取参数。- 通常用于 RESTful API 中,当 URL 中包含动态变量时(如
/user/{id}
),可以使用@PathVariable
获取该动态变量的值。
常见场景:
- 获取路径中的动态参数,例如获取用户 ID、文章 ID 等。
示例代码:
java
@RestController
@RequestMapping("/api")
public class PersonController {
// GET 请求,从路径中提取 personId
@GetMapping("/person/{personId}")
public String getPersonById(@PathVariable("personId") int personId) {
// 根据 personId 获取数据
return "Person with ID: " + personId;
}
}
解释:
@GetMapping("/person/{personId}")
表示该请求处理的是/person/{personId}
的 URL,其中{personId}
是一个动态变量。@PathVariable("personId")
用于从路径中获取personId
的值。- 如果 URL 是
/person/123
,则personId
的值为123
。
注意事项:
@PathVariable
注解中的参数名称必须与 URL 中的占位符名称一致(不区分大小写)。- 如果 URL 模式中有多个变量,可以通过多个
@PathVariable
来映射。
3. @RequestParam
用途:
@RequestParam
注解用于从请求的查询参数中提取数据,通常用于 GET 请求。@RequestParam
可以获取 URL 中的查询参数,如/api/person?id=1&name=John
中的id
和name
参数。
常见场景:
- 获取 URL 查询字符串中的参数,如从表单提交中获取参数,或者从 URL 中获取查询参数。
示例代码:
java
@RestController
@RequestMapping("/api")
public class PersonController {
// GET 请求,获取查询参数 id 和 name
@GetMapping("/person")
public String getPerson(@RequestParam("id") int id, @RequestParam("name") String name) {
return "Person ID: " + id + ", Name: " + name;
}
}
解释:
- URL 示例:
/api/person?id=1&name=John
@RequestParam("id")
获取 URL 中的查询参数id
,@RequestParam("name")
获取查询参数name
。
注意事项:
@RequestParam
默认是必需的,如果 URL 中没有对应的参数,会抛出MissingServletRequestParameterException
异常。可以通过设置required=false
来指定参数为可选:
javascript
@GetMapping("/person")
public String getPerson(@RequestParam(name = "id", required = false, defaultValue = "0") int id) {
return "Person ID: " + id;
}
@RequestParam
还支持获取参数的默认值(如上例中的defaultValue
属性)。- 对于数组或 List 类型的参数,可以接收多个同名参数:
java
@GetMapping("/person")
public String getPerson(@RequestParam List<String> names) {
return "Names: " + names;
}
URL 示例:/api/person?names=John&names=Jane
,names
会接收到一个包含 "John"
和 "Jane"
的 List。
4. 总结与对比
注解 | 用途 | 适用场景 | 例子 |
---|---|---|---|
@RequestBody |
用于请求体,将请求数据转换为 Java 对象。 | 适用于 POST/PUT 请求,接受 JSON 或 XML 数据。 | @RequestBody Person person |
@PathVariable |
用于从 URL 路径中提取变量。 | 适用于 RESTful 风格的 URL,获取路径中的动态数据。 | @GetMapping("/person/{id}") |
@RequestParam |
用于从 URL 查询参数中获取数据。 | 适用于 GET 请求,获取 URL 查询参数。 | @RequestParam("id") int id |
5. 总结
@RequestBody
用于获取请求体的数据,通常与 POST、PUT 等方法一起使用,数据通常是 JSON 格式。@PathVariable
用于从 URL 中获取动态路径参数,适用于 RESTful 风格的 API。@RequestParam
用于从 URL 查询参数中获取数据,通常用于 GET 请求,可以通过required=false
设置参数为可选。