
本文介绍如何在 Locust 压测脚本中,将 Python 列表(如 all_pp_ids)安全、正确地序列化为 JSON 格式,并作为 data 参数传入 client.post(),替代硬编码的静态值,确保请求体符合服务端对 application/json 的要求。
本文介绍如何在 locust 压测脚本中,将 python 列表(如 `all_pp_ids`)安全、正确地序列化为 json 格式,并作为 `data` 参数传入 `client.post()`,替代硬编码的静态值,确保请求体符合服务端对 `application/json` 的要求。
在 Locust 中发起 JSON POST 请求时,若需动态传入列表(例如 all_pp_ids),绝不能直接拼接字符串构造 JSON(如 '{"powerPlantIds":[73808]}'),否则易引发语法错误、类型不匹配或注入风险。正确做法是使用标准库 json 模块对 Python 字典进行序列化,确保生成合法、可解析的 JSON 字符串,并显式设置 Content-Type: application/json 头。
以下是推荐实现方式:
import json
@task(2)
def generate_bids_for_all_powerplants(self):
# 假设 all_pp_ids 已在类外或 setup 中定义(如:all_pp_ids = [73808, 73809, 73810])
payload = {"powerPlantIds": all_pp_ids}
payload_json = json.dumps(payload)
response = self.client.post(
"https://example.com/bids/generate",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
},
data=payload_json,
name="/bids/generate"
)
print("Request body sent:", response.request.body.decode())
print("All IDs used:", all_pp_ids)✅ 关键要点说明:
- 必须调用 json.dumps() 将 Python 对象转为 JSON 字符串;data= 参数接收的是字节或字符串,而非字典。
- Content-Type 头不可省略,否则服务端可能拒绝解析或误判为 application/x-www-form-urlencoded。
- 若 all_pp_ids 为空列表([]),json.dumps 仍能正确生成 "powerPlantIds": [],无需额外判空(除非业务逻辑要求校验)。
- 如需更健壮的错误处理,可添加 try/except 捕获 json.JSONEncodeError;若数据含非标准类型(如 datetime),需自定义 JSONEncoder。
⚠️ 注意:不要使用 str() 或 f-string 拼接 JSON —— 这极易因引号嵌套、特殊字符(如中文、斜杠)导致格式损坏,且无法自动转义,存在严重安全隐患与兼容性风险。始终信赖 json.dumps() 进行序列化。


















