JMeter中GET请求引用变量失败:Socket closed错误排查
看起来你已经把正则提取这一步做对了,但变量代入请求后遇到了服务器主动关闭连接的问题,而且浏览器能正常运行相同请求,那我们从几个常见的方向排查:
检查变量是否包含隐藏空白字符
有时候正则提取可能会带回换行、制表符或者不可见的空白字符,虽然Debug Sampler显示的内容看起来正常,但实际变量里的这些字符会让URL参数格式异常。你可以用JSR223 Sampler对提取到的变量做个清理:// 提取变量并去除首尾空白 def cleanTicket = vars.get("ticketID_g1").trim() // 把清理后的变量存入新的变量名 vars.put("cleanTicketID", cleanTicket)之后在第二个请求里用
${cleanTicketID}代替原来的变量,试试能不能解决问题。核对请求URL的拼接逻辑
我注意到你描述里的第二个请求URL写的是://localhost:8080/ibi_apps/rs?IBIRS_action=getReport&IBIRS_ticketName=${ticketID_g1}cmrpip000589_EDASERVE&IBIRS_service=defer但Results Tree里显示的请求参数是
IBIRS_ticketName=2019-05-09-16-59-54cmrpip000613_EDASERVE——如果原来的URL里多了后面的cmrpip000589_EDASERVE,那拼接后的参数值就会变成两个ticket字符串连在一起,这肯定会让服务器无法识别,直接关闭连接。务必确认参数拼接完全正确,不要多带多余的字符。模拟浏览器的请求头和连接设置
JMeter默认的请求头和浏览器差异很大,服务器可能会因为识别到非浏览器请求而拒绝连接,或者对Keep-Alive的处理逻辑不同:- 打开浏览器开发者工具(F12),复制请求的全部请求头(比如User-Agent、Accept、Cookie等),在JMeter的HTTP请求里添加这些请求头;
- 去HTTP请求的「高级」标签页,取消勾选「使用Keep-Alive」,或者适当调大连接超时时间。
查看服务器端日志
Socket Closed通常是服务器主动终止了连接,大概率是请求不符合服务器的预期(比如参数格式错误、请求长度超限、权限问题)。去服务器的日志文件里找对应请求的记录,看看有没有具体的报错信息,这能帮你快速定位问题根源。
内容的提问来源于stack exchange,提问作者MAK

