@RequestParam
和 @RequestBody
在 Java 的 Spring MVC 开发中,@RequestParam
和 @RequestBody
是处理 HTTP 请求中参数的两个常用注解。前者用于绑定请求中的 URL 参数或表单数据,后者则用于将请求体(JSON、XML等)解析为 Java 对象。正确理解它们的使用场景和区别,是开发 RESTful API 的基础技能。本文将从基础知识、代码示例到实际应用,详细解析这两个注解的用法,帮助小白快速上手。
在开发 RESTful 服务时,处理客户端发送的参数是一个常见需求。Spring 框架为开发者提供了许多注解来简化这一过程,其中 @RequestParam
和 @RequestBody
是最常用的两种:
@RequestParam
:从请求的 URL 参数、表单数据或查询字符串中获取值。@RequestBody
:将请求体中的 JSON 或其他格式的数据绑定到 Java 对象。通过本文,你将学习:
@RequestParam
?@RequestParam
主要用于获取 HTTP 请求中的查询参数(Query Parameters)或表单数据(Form Data)。它会将参数值绑定到方法的参数上。
示例代码:
@RestController
@RequestMapping("/api")
public class DemoController {
@GetMapping("/greet")
public String greet(@RequestParam String name) {
return "Hello, " + name + "!";
}
}
请求示例:
GET /api/greet?name=默语
响应:
Hello, 默语!
你可以为参数设置默认值,避免请求中缺少参数时报错。
@GetMapping("/greet")
public String greet(@RequestParam(defaultValue = "Guest") String name) {
return "Hello, " + name + "!";
}
请求示例:
GET /api/greet
响应:
Hello, Guest!
默认情况下,@RequestParam
是必填的。如果参数缺失,会抛出 MissingServletRequestParameterException
。可以通过 required
属性将其设置为非必填。
@GetMapping("/greet")
public String greet(@RequestParam(required = false) String name) {
return "Hello, " + (name != null ? name : "Guest") + "!";
}
@RequestBody
?@RequestBody
用于将 HTTP 请求体中的 JSON 数据反序列化为 Java 对象。常用于处理复杂的请求数据,例如 POST 请求中的表单或 JSON 数据。
示例代码:
@RestController
@RequestMapping("/api")
public class DemoController {
@PostMapping("/user")
public String createUser(@RequestBody User user) {
return "User " + user.getName() + " has been created!";
}
}
// User 类
public class User {
private String name;
private int age;
// Getters 和 Setters
}
请求示例:
POST /api/user
Content-Type: application/json
{
"name": "默语",
"age": 25
}
响应:
User 默语 has been created!
@RequestBody
注解会报错:
如果没有 @RequestBody
注解,Spring 不会将请求体绑定到方法参数。@Valid
和 @Validated
注解可以对请求体的数据进行校验。示例:
@PostMapping("/user")
public String createUser(@Valid @RequestBody User user) {
return "User " + user.getName() + " has been created!";
}
@RequestParam
和 @RequestBody
在实际开发中,我们常会遇到一个接口需要同时接收查询参数和请求体的场景。
示例代码:
@PostMapping("/order")
public String createOrder(
@RequestParam String orderId,
@RequestBody OrderDetails details
) {
return "Order " + orderId + " for " + details.getProductName() + " has been created!";
}
// OrderDetails 类
public class OrderDetails {
private String productName;
private int quantity;
// Getters 和 Setters
}
请求示例:
POST /api/order?orderId=12345
Content-Type: application/json
{
"productName": "Laptop",
"quantity": 1
}
响应:
Order 12345 for Laptop has been created!
特性 | @RequestParam | @RequestBody |
---|---|---|
数据来源 | URL 查询参数或表单数据 | HTTP 请求体 |
常用场景 | 简单的查询参数 | 复杂的数据结构(JSON、XML 等) |
支持的数据格式 | 字符串、基本数据类型 | JSON、XML 等(需要序列化/反序列化) |
是否必需 | 默认必需(可通过 required=false 设置为非必需) | 默认必需(需要配合校验工具进行验证) |
处理方式 | 参数直接绑定到方法参数 | 请求体映射为 Java 对象 |
通过本文的学习,我们深入了解了 @RequestParam
和 @RequestBody
的基础用法、应用场景及两者的区别。无论是简单的查询参数,还是复杂的请求体数据,Spring 都为开发者提供了灵活而强大的工具。掌握这些工具,可以让你的 RESTful API 更加高效、简洁。