一、@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)