@RequestParam @RequestHeader @RequestBody 三者详解
好的!我用大白话和比喻来解释这三个注解的区别:
🧩 @RequestParam
作用:从网址的“问号后面”拿参数。
场景:比如你打开淘宝搜索商品,网址是:
https://taobao.com/search?keyword=手机&price=2000
这里的 keyword=手机
和 price=2000
就是通过 @RequestParam
拿到的。
通俗比喻:
像你去餐厅点菜,服务员问你:“要什么菜?辣不辣?”,你回答:“水煮鱼,中辣”。
@RequestParam
就是服务员记下你回答的“参数”(菜名和辣度)。
代码示例:
// 访问 /order?food=水煮鱼&spicy=中辣
@GetMapping("/order")
public void order(@RequestParam("food") String food, // 拿到 "水煮鱼"@RequestParam("spicy") String spicy // 拿到 "中辣"
) {}
🧩 @RequestBody
作用:从请求的“身体里”拿一大段数据(比如 JSON)。
场景:比如你注册账号时,提交的信息(用户名、密码、手机号)会被包装成一个 JSON 对象发送给服务器。
通俗比喻:
像你寄快递,把一堆东西打包成一个箱子,快递员直接拆箱验货。
@RequestBody
就是拆开箱子,把里面的东西(JSON 数据)直接转成一个 Java 对象。
代码示例:
// 提交 JSON:{"username": "张三", "password": "123456"}
@PostMapping("/register")
public void register(@RequestBody User user) {// user 对象里直接有 username 和 password
}
🧩 @RequestHeader
作用:从请求的“头信息”里拿数据(比如浏览器类型、登录令牌)。
场景:比如你登录后,服务器给你一个 token,后续请求需要把这个 token 放在请求头里。
通俗比喻:
像你去银行办业务,工作人员会先看你的身份证(放在“头信息”里),而不是你填的表单。
@RequestHeader
就是工作人员检查你的身份证信息。
代码示例:
// 请求头里带:Authorization: Bearer xxx-token
@GetMapping("/profile")
public void profile(@RequestHeader("Authorization") String token) {// 拿到 token,检查用户是否登录
}
🌟 总结成一张表
注解 | 作用 | 比喻 | 典型场景 |
---|---|---|---|
@RequestParam | 从网址问号后拿参数 | 服务员记下你的点菜要求 | GET 请求、搜索过滤条件 |
@RequestBody | 从请求体拿完整数据 | 拆快递箱验货 | POST/PUT 提交 JSON 数据 |
@RequestHeader | 从请求头拿隐藏信息 | 银行检查身份证 | 身份验证(Token)、浏览器信息 |
❌ 常见错误
-
用
@RequestParam
去拿 JSON 数据
• 错:@RequestParam
只能拿?key=value
,拿不了 JSON 里的数据!• 对:JSON 必须用
@RequestBody
。 -
把 Token 放在网址里(
?token=xxx
)
• 错:Token 应该通过@RequestHeader
放在请求头里,更安全! -
忘写
@RequestBody
• 错:提交 JSON 时如果没写这个注解,后端根本拿不到数据!
记住这三点,写代码时就不会搞混啦! 😉