JMeter用CSV提取数据发HTTP请求返回400,手动传参正常
解决JMeter请求体末尾换行导致400错误的问题
问题根源
从CSV提取的login_type、username、password变量可能包含换行符或首尾空白字符,当这些变量插入请求体后,最终的JSON会带有多余换行,导致服务器解析失败返回400。
解决方案
1. 在JSR223脚本中清理变量值
修改变量赋值逻辑,通过trim()方法去除字符串首尾的空白(包括换行符、空格、制表符等),同时优化冗余的循环逻辑:
import org.apache.commons.io.IOUtils import java.nio.charset.StandardCharsets import groovy.json.JsonOutput import groovy.json.JsonSlurper def response = prev.getResponseDataAsString() // 按换行分割并过滤空行,避免处理CSV末尾无效行 def lines = response.split('\n').findAll { it.trim() != '' } def userData = [] for (int i = 1; i < lines.length; i++) { def line = lines[i].trim() def tokens = line.split(',') // 对每个字段做首尾空白清理 userData << [ login_type: tokens[0].trim(), username: tokens[1].trim(), password: tokens[2].trim() ] } def jsonMap = new JsonSlurper().parseText(JsonOutput.toJson(userData)) def threadIndex = Integer.parseInt(vars.get('__threadNum')) - 1 // 直接通过线程号取对应数据,无需多余循环 if (threadIndex < jsonMap.size()) { vars.put("login_type", jsonMap[threadIndex].login_type) vars.put("username", jsonMap[threadIndex].username) vars.put("password", jsonMap[threadIndex].password) }
2. 在请求体中直接清理变量
如果不想修改脚本,可在请求体里使用JMeter的__trim()函数去除变量首尾空白:
{"login_type":"${__trim(${login_type})}","username":"${__trim(${username})}","password":"${__trim(${password})}"}
3. 确保请求体本身无多余换行
检查HTTP请求的请求体输入框,确保整个JSON是紧凑的单行格式,没有手动添加的换行或空格;如果是从文件读取请求体,需确保文件内容是单行JSON,无末尾换行。
验证方法
运行脚本后,通过JMeter的查看结果树查看第二个请求的“请求体”,确认JSON为单行紧凑格式且无多余换行符,再验证服务器响应是否正常。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

