一、@RequestParam(你项目绝大多数接口在用,form 表单 / URL 查询参数)
1. 接收数据来源
两种数据载体:
- GET 请求:URL
?后面拼接的键值对 例:/actionmall/product/findproducts.do?pageNum=1&pageSize=10 - POST 表单提交:
Content-Type: application/x-www-form-urlencoded(你 JMeter 所有接口都是这个类型) 表单体:account=zhangsan&password=123456
2. 核心属性
java
// 完整写法
@RequestParam(
value = "前端参数名",
required = true, // 是否必传,不传直接400报错
defaultValue = "1" // 参数缺失时默认值,自动使required=false
)
required=true(默认):压测时 JMeter 漏传该参数,直接返回 400,计入错误率(你 20%/50% 报错核心诱因)defaultValue:兜底,分页、ID 类参数推荐配置,减少压测失败
3. 多值 / 数组接收(购物车批量结算场景)
前端传:cartIds=1&cartIds=2&cartIds=3
java
// 直接接收集合
public Result createOrder(@RequestParam List<Long> cartIds)
4. 适用场景
你的全量前台、后台、支付回调接口全部适配; 不能接收 JSON 字符串,如果前端传 JSON,用这个注解会接收不到任何数据。
5. JMeter 匹配示例
plaintext
POST /actionmall/user/do_shturl.c
Content-Type: application/x-www-form-urlencoded
account=zhangsan&password=123456&captchaKey=test
后端接收:
java
@RequestMapping("/user/do_shturl.c")
public Result login(
@RequestParam String account,
@RequestParam String password,
@RequestParam String captchaKey
)
二、@RequestBody(接收 JSON 请求体,表单接口完全不兼容)
1. 接收数据来源
请求请求体完整 JSON 字符串 ,要求请求头:Content-Type: application/json 请求体示例:
json
{
"productId": 1,
"quantity": 2
}
2. 核心特性
- 只能有一个
@RequestBody注解,整个请求体只能绑定一个实体类; - 自动 JSON 序列化 / 反序列化,底层依赖 Jackson;
- 完全不识别 form 表单、URL 问号参数,混用直接参数为空、400 报错。
3. 代码示例
java
// 实体类
public class CartDTO {
private Long productId;
private Integer quantity;
}
// Controller
@RequestMapping("/cart/add")
public Result addCart(@RequestBody CartDTO cartDTO) {
// 自动把JSON映射到CartDTO对象
}
4. 和你现有压测冲突点
你当前 JMeter 全部是application/x-www-form-urlencoded表单,如果后端接口写了@RequestBody,所有请求参数全部接收失败,错误率 100%。
改造方式:JMeter 请求头改为
application/json,请求体切换为 Raw JSON。
三、@PathVariable(提取 URL 路径中的动态变量,无请求参数)
1. 接收数据来源
从URL 路径本身 截取变量,不是问号、不是表单、不是 JSON。 URL 示例:/actionmall/product/detail/{productId} 这里 {productId} 就是路径变量。
2. 代码示例
java
@RequestMapping("/product/detail/{productId}")
public Result getDetail(@PathVariable Long productId) {
// productId 从URL路径中提取
}
访问地址:/actionmall/product/detail/1 → productId=1
3. 多路径变量
java
@RequestMapping("/order/{orderNo}/log/{logId}")
public Result log(@PathVariable String orderNo, @PathVariable Long logId)
4. 关键限制
- 仅解析路径占位符,拿不到表单、URL 后的
?参数; - 没有
required、defaultValue属性,路径缺少占位符直接 404 页面不存在; - 适合 RESTful 风格接口,你当前电商项目几乎没有这类接口。
四、三者核心对比表(一目了然)
表格
| 注解 | 数据源 | 对应 Content-Type | 典型传参格式 | 你的项目适配度 |
|---|---|---|---|---|
| @RequestParam | URL? 参数 /form 表单 | application/x-www-form-urlencoded | key=val&key2=val2 |
极高(全部现有接口) |
| @RequestBody | 请求体 JSON | application/json | {"key":val} |
低(无现有接口) |
| @PathVariable | URL 路径占位符 | 无要求,不依赖请求体 | /xxx/{id} |
极低 |
五、结合你压测报错的避坑重点
-
不要混用 @RequestBody 和表单 后端接口写了
@RequestBody,但 JMeter 用表单传参 → 参数全部为空,大量 400 错误; -
@RequestParam 的 required=true 是报错重灾区 分页、地址 ID、验证码等参数如果漏传,直接失败,建议分页加
defaultValue="1"兜底; -
@PathVariable 不存在默认值 如果路径变量缺失,不会进入接口方法,直接 404,无法通过注解兜底;
-
同一接口可以同时使用
@RequestParam + @PathVariable例:/product/{id}?page=1java
public Result test(@PathVariable Long id, @RequestParam Integer page)