You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LocustIO调用所有POST API均返回500内部服务器错误问题

Locust POST请求返回500错误的坑与解决

最近用Locust做负载测试时碰到个头疼的问题:所有通过Locust调用的POST接口一律返回Internal Server Error - 500,但一模一样的接口在JMeter里跑却完全正常。折腾了好一阵才发现,居然是Locust的请求格式没设置对,甚至导致请求末尾莫名多了个撇号!

先给大家看看我当时的测试代码:

from locust import HttpLocust, TaskSet, task

class justTestApi(TaskSet):
    @task(1)
    def accountInquiry(self):
        self.client.post("/users", {
            "id": 1,
            "name": "Leanne Graham",
            "username": "Bret"
        })

问题根源其实很好理解:当你直接把字典作为第二个参数传给self.client.post时,Locust默认会把它当成form-data格式的请求体发送,但很多后端接口是期望接收JSON格式的。后端解析不了这种格式的请求,自然就返回500错误了,你看到的末尾撇号应该就是格式不兼容导致的解析异常表现。

解决起来也很简单,两种方法任选其一:

方法一:直接使用json参数

Locust的post方法支持直接传json参数,它会自动帮你设置正确的请求头并序列化数据:

from locust import HttpLocust, TaskSet, task

class justTestApi(TaskSet):
    @task(1)
    def accountInquiry(self):
        self.client.post(
            "/users", 
            json={
                "id": 1,
                "name": "Leanne Graham",
                "username": "Bret"
            }
        )

方法二:手动设置请求头并序列化JSON

如果你需要更灵活地控制请求头,可以手动把字典转成JSON字符串,同时设置Content-Type:

import json
from locust import HttpLocust, TaskSet, task

class justTestApi(TaskSet):
    @task(1)
    def accountInquiry(self):
        headers = {"Content-Type": "application/json"}
        payload = {
            "id": 1,
            "name": "Leanne Graham",
            "username": "Bret"
        }
        self.client.post("/users", data=json.dumps(payload), headers=headers)

改成这样之后,再跑测试应该就能和JMeter一样正常调用接口啦!

内容的提问来源于stack exchange,提问作者ken4ward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:28:27