前端传来的不同类型参数,后端 SpringMVC 怎么接收?
SpringMVC 处理前端请求参数的方式主要有 4 种常见情况:
参数来源 | 前端传递方式 | 后端接收方式 | 示例 |
---|---|---|---|
1. 路径参数(PathVariable ) | /user/1001 | @PathVariable | @GetMapping("/user/{id}") |
2. 查询参数(RequestParam ) | /user?id=1001 | @RequestParam | @GetMapping("/user") |
3. 请求体参数(RequestBody ) | { "id": 1001, "name": "张三" } (JSON) | @RequestBody | @PostMapping("/user") |
4. 表单参数(RequestParam ) | name=张三&age=22 (x-www-form-urlencoded ) | @RequestParam 或 Java 对象 | @PostMapping("/user") |
📌 1. 路径参数(@PathVariable)
👉 场景:前端把参数放到 URL 里(RESTful 风格)
📌 示例:查询 id=1001
的用户
-
前端请求:
-
GET /user/1001
@GetMapping("/user/{id}")
public Result<User> getUserById(@PathVariable Long id) {
return Result.success(userService.getById(id));
} -
特点:
-
@PathVariable
把 URL 里的{id}
取出来,自动转成 Java 类型。 -
适合 RESTful API 设计,比如
/user/1001
。
-
2. 查询参数(@RequestParam)
👉 场景:前端以 ?key=value
形式传参(URL 查询参数)
📌 示例:查询 id=1001
的用户
-
前端请求:
-
GET /user?id=1001
@GetMapping("/user")
public Result<User> getUserById(@RequestParam("id") Long id) {
return Result.success(userService.getById(id));
}
-
特点:
-
@RequestParam("id")
从 URL 查询参数获取值。 -
如果前端没传
id
,SpringMVC 会报错(可以加required = false
设置为可选)。 -
适用于 简单查询参数,如
/search?keyword=apple&sort=desc
。
-
📌 多个参数的情况
@GetMapping("/search")
public Result<List<User>> search(@RequestParam String name, @RequestParam(required = false) Integer age) {
return Result.success(userService.search(name, age));
}
请求:
GET /search?name=张三&age=22
📌 3. 请求体参数(@RequestBody)
👉 场景:前端提交 JSON 数据,后端解析成 Java 对象
📌 示例:前端提交用户信息
-
前端请求(POST 请求,JSON 数据):
-
{
"id": 1001,
"name": "张三",
"phone": "1234567890"
}
@PostMapping("/user")
public Result createUser(@RequestBody UserDTO userDTO) {
userService.create(userDTO);
return Result.success();
}特点:
-
@RequestBody
接收 JSON 数据,并自动解析成 Java 对象。 -
适用于 POST、PUT 请求,比如用户注册、订单提交。
4. 表单参数(@RequestParam 或 Java 对象)
👉 场景:前端以 x-www-form-urlencoded
方式提交表单数据
📌 示例:用户提交表单
-
前端请求:
POST /user Content-Type: application/x-www-form-urlencoded name=张三&age=22 后端处理(方式 1:单个参数用
@RequestParam
)@PostMapping("/user") public Result createUser(@RequestParam String name, @RequestParam Integer age) { return Result.success(); } - 后端处理(方式 2:封装成 Java 对象)
- @PostMapping("/user")
public Result createUser(UserDTO userDTO) {
return Result.success();
}
- 这里 不用
@RequestParam
,SpringMVC 会自动把表单数据映射到UserDTO
。
综合案例
后端方法:支持 GET
和 POST
@RestController
@RequestMapping("/user")
public class UserController {
// 查询用户(路径参数)
@GetMapping("/{id}")
public Result<User> getUserById(@PathVariable Long id) {
return Result.success(userService.getById(id));
}
// 查询用户(查询参数)
@GetMapping
public Result<User> getUserById(@RequestParam("id") Long id) {
return Result.success(userService.getById(id));
}
// 创建用户(JSON 请求体)
@PostMapping
public Result createUser(@RequestBody UserDTO userDTO) {
userService.create(userDTO);
return Result.success();
}
// 更新用户(表单提交)
@PostMapping("/update")
public Result updateUser(UserDTO userDTO) {
userService.update(userDTO);
return Result.success();
}
}
🔹 总结
参数来源 | 传输方式 | 后端注解 | 适用场景 |
---|---|---|---|
路径参数 | /user/1 | @PathVariable | RESTful API,用户详情 |
查询参数 | /user?id=1 | @RequestParam | 搜索、分页、简单查询 |
请求体 JSON | { "id": 1, "name": "张三" } | @RequestBody | 创建、更新数据(POST/PUT) |
表单参数 | name=张三&age=22 | @RequestParam 或 Java 对象 | 普通表单提交 |