如何用JMeter发送HTTP请求创建用户?参数缺失问题排查
问题排查:JMeter批量创建用户时参数无法被后端识别
我使用JMeter通过HTTP请求调用后端控制器的create函数,批量创建5个数据相同的新用户。JMeter查看结果树返回响应:
"Missing mandatory params: Ref{val=[username, firstname, email, password, phonenumber, address]}"
请求已到达目标函数,但后端日志仅显示POST /user/create,无法看到传递的参数,且后端日志中所有参数提取结果(maybeUsername、maybeFirstname等)均为空值,需排查该问题。
后端控制器create函数代码
public Result create(Http.Request request){ var body = safeJsonBody(request); var mandatory_params = Ref.of(List.of("username", "firstname", "email", "password", "phonenumber", "address")); var maybeUsername = extractNonEmptyString(body, "username"); var maybeFirstname = extractNonEmptyString(body, "firstname"); var maybeEmail = extractEmail(body, "email"); var maybePassword = extractNonEmptyString(body, "password"); var hashedPassword = ""; if(!maybePassword.isEmpty()) { var hash = hashFactory.mkHash(maybePassword.get(), Registration); hashedPassword= hash.get().hash; } var maybePhonenumber = extractNonEmptyString(body, "phonenumber"); var maybeAddress = extractNonEmptyString(body, "address"); logger.warn("maybeUsername : " + maybeUsername); logger.warn("maybeFirstname : " + maybeFirstname); logger.warn("maybeEmail : " + maybeEmail); logger.warn("maybePassword : " + maybePassword); logger.warn("maybePhonenumber : " + maybePhonenumber); logger.warn("maybeAddress : "+maybeAddress); if ( maybeUsername.isEmpty() || maybeFirstname.isEmpty() || maybeEmail.isEmpty() || maybePassword.isEmpty()) { checkIfIsPresent(mandatory_params,maybeUsername,"username"); checkIfIsPresent(mandatory_params,maybeFirstname,"firstname"); checkIfIsPresent(mandatory_params,maybeEmail,"email"); checkIfIsPresent(mandatory_params,maybePassword,"password"); checkIfIsPresent(mandatory_params,maybePhonenumber,"phonenumber"); checkIfIsPresent(mandatory_params,maybeAddress,"address"); return badRequest("Missing mandatory params: " + mandatory_params); } var tx = usersModel.upsert(maybeUsername.get(),maybeFirstname.get(), maybeEmail.get(),hashedPassword,maybePhonenumber.get(),maybeAddress.get()); if (tx.isEmpty()){ logger.warn(tx.toString()); return internalServerError(stc_map_to_json(Map.of("status","error","message", "The user could not be created or updated.")).get()); } return ok(tx.get()); }
排查步骤
验证JMeter请求格式:后端通过
safeJsonBody(request)解析JSON请求体,需确保JMeter配置正确:- HTTP请求方法设置为
POST - 添加HTTP信息头管理器,设置
Content-Type为application/json - 在"Body Data"中填写合法的JSON参数,示例:
{ "username": "test_user", "firstname": "Test", "email": "test@demo.com", "password": "demo123", "phonenumber": "13900139000", "address": "Demo Address" } - 若使用CSV参数化,确认变量引用(如
${username})在JSON中正确替换,且CSV文件路径、编码配置无误
- HTTP请求方法设置为
检查后端JSON解析逻辑:确认
safeJsonBody方法能正确处理请求体,比如:- 是否仅接受
application/json类型的请求 - 是否处理了请求体的编码问题(如UTF-8)
- 是否存在解析异常被静默处理的情况,导致返回空的JSON对象
- 是否仅接受
添加请求体日志:在
create函数开头添加日志,打印原始请求体内容,直接验证JMeter发送的参数是否到达后端:logger.warn("Received request body: " + request.body().asString());确认JMeter批量请求的有效性:查看JMeter查看结果树中每个请求的"Request"标签页,检查每个请求的请求体是否正确生成,避免因线程组配置错误导致参数未被传递
内容的提问来源于stack exchange,提问作者Rune
相关产品推荐
相关产品推荐

