Jmeter读取CSV数据发送POST请求时如何跳过请求体内的空值
问题根因
你的代码仅能处理第一行CSV数据的核心原因是第一次执行后直接覆盖了采样器的原始请求体模板:
- 首次迭代CSV时,你从采样器获取的是带
${number}、${market}占位符的原始请求体,处理完空值后直接把采样器的参数替换为第一行数据处理后的固定JSON - 后续CSV迭代时,采样器内已经没有可替换变量的占位符,无法读取新行的变量值,自然不会生成新的请求
- 额外问题:
evaluate(request.inspect())是非常不推荐的对象拷贝写法,性能差且易出现不可预知的逻辑异常
修复方案
操作步骤
你可以选择两种方式处理,二选一即可:
方式1:抽离模板到变量(推荐,便于后续修改)
- 新增「用户定义变量」组件,添加变量
json_template,值为你的原始请求体:
{ "number": "${number}", "marker": "${market}", "description": "${description}" }
- 清空HTTP采样器原有的Body内容。
方式2:直接把模板写在代码里
无需额外加组件,直接在JSR223代码里定义模板字符串即可。
最终JSR223代码
// 方式1用这行读取模板 def rawTemplate = vars.get("json_template") // 方式2替换上面一行为: // def rawTemplate = '{"number": "${number}","marker": "${market}","description": "${description}"}' // 替换当前CSV行对应的变量值 def replacedContent = org.apache.jmeter.util.JMeterUtils.replaceVariables(rawTemplate) // 解析为JSON对象 def json = new groovy.json.JsonSlurper().parseText(replacedContent) // 过滤空值字段,如需兼容null/空白字符,可改为 it.value?.toString()?.trim() != '' def cleanedJson = json.findAll { it.value != '' } // 生成最终JSON串 def finalBody = new groovy.json.JsonBuilder(cleanedJson).toPrettyString() // 写入采样器请求体 sampler.getArguments().removeAllArguments() sampler.addNonEncodedArgument('', finalBody, '') sampler.setPostBodyRaw(true)
内容的提问来源于stack exchange,提问作者Ramesh Babu
相关产品推荐
相关产品推荐

