在 Java Spring MVC 中,@RequestBody 和 @RequestParam 可以在同一个控制器方法中混合使用,以接收不同来源的参数。这种组合方式在处理复杂请求时非常有用。
1、使用场景
通常情况下,@RequestParam 用于处理 URL 查询参数或表单数据,而 @RequestBody 用于处理请求体中的 JSON 或 XML 数据。混合使用时,可以同时接收来自 URL 参数和请求体的数据。
示例代码
@PostMapping("/users")
public String createUser(
@RequestParam(value = "userId", required = false) String userId,
@RequestParam(value = "action", required = false) String action,
@RequestBody User user) {
// userId 和 action 来自 URL 参数或表单数据
// user 对象来自请求体的 JSON 数据
return "用户ID: " + userId + ", 操作: " + action + ", 用户信息: " + user.getName();
}
2、请求示例
发送一个 POST 请求到 /users,包含以下内容:
URL 参数:userId=123&action=create
请求体(JSON 格式):
{
"name": "张三",
"age": 25
}
注意事项
参数数量限制:一个方法中只能有一个 @RequestBody 参数,但可以有多个 @RequestParam 参数。
HTTP 方法:@RequestBody 通常用于 POST、PUT、PATCH 等方法,而 @RequestParam 可用于 GET、POST 等方法。
Content-Type:使用 @RequestBody 时,请求头的 Content-Type 必须设置为 application/json 或其他支持的格式。
请求体唯一性:一个请求只能有一个请求体,因此 @RequestBody 只能用于接收整个请求体。
3、实际应用
例如,一个订单创建接口可能需要从 URL 获取用户 ID,从请求体获取订单详情:
@PostMapping("/orders")
public String createOrder(
@RequestParam String userId,
@RequestParam(required = false) String couponCode,
@RequestBody OrderRequest orderRequest) {
// userId 来自 URL 参数
// couponCode 来自 URL 参数(可选)
// orderRequest 来自请求体的 JSON 数据
return "用户ID: " + userId + ", 优惠券: " + couponCode + ", 订单商品数: " + orderRequest.getProducts().size();
}
这种混合使用方式使得接口设计更加灵活,能够同时处理不同类型的参数。