【踩坑记录】Locust压测中文参数总是乱码,这个解决方案90%的人都不知道

【踩坑记录】Locust压测中文参数总是乱码,这个解决方案90%的人都不知道
难度等级新手 | ⏰ 阅读时间6 分钟 | 实用指数⭐⭐⭐⭐⭐最近做 Locust 压力测试遇到一个特别奇葩的问题中文参数传到服务端总是乱码搜了全网都没找到靠谱的解决方案折腾了整整2天踩了好几个坑终于搞定了。今天把完整的排查过程分享出来希望大家少走弯路。问题现象用 Locust 发 POST 请求请求体里的中文参数服务端收到后全是乱码fromlocustimportHttpUser,taskclassTestUser(HttpUser):taskdeftest_api(self):data{username:张三,content:这是一条测试消息}self.client.post(/api/test,jsondata)服务端收到的username变成了å¼ ä¸‰典型的 UTF-8 被当成 Latin-1 解码了。排查过程坑1以为是 headers 问题一开始以为是没加Content-Type: application/json; charsetutf-8手动加上了还是不行headers{Content-Type:application/json; charsetutf-8}self.client.post(/api/test,jsondata,headersheaders)结果还是乱码。坑2以为是 Python 编码问题然后怀疑是 Python 的字符串编码问题手动 encode 成 UTF-8data{username:张三.encode(utf-8),content:这是一条测试消息.encode(utf-8)}结果更糟了直接变成了 bytes 对象的字符串表示。坑3换用 data 参数不用json参数改用data手动 dumpsimportjson self.client.post(/api/test,datajson.dumps(data,ensure_asciiFalse),headers{Content-Type:application/json})还是不行看到这里的朋友说明你也是真心想把 Locust 压测搞懂的。觉得有用的话可以先点个赞后面的解决方案更干 终于找到原因了翻了 Locust 的源码才发现Locust 底层用的是 requests 库但它默认会把请求体当成 Latin-1 编码处理具体来说requests库的json参数在序列化时会默认用ensure_asciiTrue这本来没问题但 Locust 在某些版本里会额外做一次编码转换导致中文被双重编码。终极解决方案两种方法亲测都有效方法1手动编码 指定编码推荐fromlocustimportHttpUser,taskimportjsonclassTestUser(HttpUser):taskdeftest_api(self):data{username:张三,content:这是一条测试消息}# 关键ensure_asciiFalse encode(utf-8)bodyjson.dumps(data,ensure_asciiFalse).encode(utf-8)self.client.post(/api/test,databody,headers{Content-Type:application/json; charsetutf-8})方法2直接用 requests 的原生方法如果上面的方法还不行直接绕过 Locust 的 client用 requests 原生方法importrequestsclassTestUser(HttpUser):taskdeftest_api(self):data{username:张三}responserequests.post(self.host/api/test,jsondata,headers{Content-Type:application/json; charsetutf-8})验证方法加个日志打印一下发送的原始请求体确认编码正确importlogging bodyjson.dumps(data,ensure_asciiFalse).encode(utf-8)logging.info(f请求体{body.decode(utf-8)})只要日志里的中文是正常的服务端收到的就不会乱码。以上就是我这次的完整踩坑过程如果你还有别的 Locust 压测问题欢迎评论区交流。原创不易如果这篇文章帮到了你麻烦点个赞、收藏一下也欢迎关注我的博客后续会持续分享测试开发相关的实战干货。