JMeter获取Token后执行PATCH请求抛出线程异常且Token为空问题
解决JMeter测试Docker部署Django时的NoHttpResponseException及Token提取失败问题
我来帮你捋捋这个问题——你已经成功通过POST请求拿到了Django返回的Token,但提取环节出问题导致token变量为空,后续的PATCH请求因此触发了NoHttpResponseException。结合你单EC2+Docker部署Django的测试场景,咱们一步步拆解排查:
一、先彻底修复Token提取为空的核心问题
Debug Sampler显示token为空,这是后续请求失败的关键诱因,先把这个环节搞定:
- 核对JSON提取器的作用范围:你设置了"仅主样本",得确认POST请求的响应确实属于主样本。可以在JMeter的「View Results Tree」里查看POST请求的详情,右键选「View Results in Table」,确认样本类型是
Main Sample。如果请求有自动跳转的子样本,建议把提取范围改成「主样本和子样本」,或者直接给JSON提取器指定仅作用于POST请求(通过「Apply to」选项选择特定的样本)。 - 验证JSON路径的准确性:把POST请求返回的完整JSON响应复制出来,用JMeter自带的「JSON Path Tester」(在View Results Tree里切换到这个标签)测试
$.token是否能精准提取到Token值。如果你的响应是嵌套结构(比如{"data": {"token": "xxx"}}),那当前的JSON路径就不对,得改成$.data.token才行。 - 检查变量引用的正确性:在PATCH请求里,你是不是用
${token}来引用提取的变量?要确保变量名和JSON提取器里设置的「变量名token」完全一致,JMeter的变量是大小写敏感的,别写错了。 - 插入Debug Sampler定位问题:把Debug Sampler放在POST请求和PATCH请求之间,运行测试后查看
token变量的实际值,确认是提取环节没拿到值,还是后续环节变量被意外覆盖了。
二、排查NoHttpResponseException的潜在原因
这个错误本质是客户端(JMeter)和服务器(Django容器)之间的连接中断,结合你的部署场景,可能的原因有这些:
- Docker端口映射与EC2网络配置:你在JMeter里请求的是
localhost:8000,如果JMeter是在EC2本地运行,要确认Docker容器的8000端口已经正确映射到EC2的8000端口(运行docker ps查看端口映射情况);如果JMeter是远程运行,得换成EC2的公网IP/域名,同时确保EC2安全组开放了8000端口的入站规则。 - Django服务器选型问题:如果你用的是Django默认的
runserver开发服务器,那问题大概率出在这——开发服务器是单线程的,10线程的并发请求很容易把它打挂,导致无法响应后续请求。哪怕是测试环境,也建议换成Gunicorn或uWSGI这类生产级WSGI服务器,配置多进程/多线程来处理并发。 - 调整JMeter的HTTP连接参数:JMeter默认的连接配置可能不匹配你的场景,可以做这些调整:
- 在HTTP请求的「高级」标签里,把「连接超时」和「响应超时」调大,比如设为5000毫秒(5秒);
- 打开JMeter安装目录下的
jmeter.properties文件,修改httpclient4.retrycount=1(增加重试次数)和httpclient4.idletimeout=60000(延长连接空闲超时),保存后重启JMeter。
- 检查Docker与EC2的资源限制:测试时如果EC2或Docker容器的CPU、内存资源耗尽,服务器也会无法响应请求。可以用
docker stats命令查看容器的实时资源使用情况,或者在EC2控制台查看实例的监控指标,确认资源是否足够支撑测试负载。
三、验证PATCH请求本身的配置正确性
排除前面的问题后,还要确认PATCH请求的配置是否符合Django接口要求:
- 请求头必须配置正确:Django REST Framework的PATCH请求需要两个关键请求头:
Content-Type: application/json(指定请求体格式)和Authorization: JWT ${token}(携带Token认证),确保这两个头都正确添加到了PATCH请求里。 - 请求体格式要匹配接口要求:检查PATCH请求的JSON体是否符合接口的参数要求,比如有没有缺少必填字段、字段格式错误等。可以先用Postman手动调用该PATCH接口,用正确的Token测试,确认接口本身是正常的,再回到JMeter里同步配置。
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

