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

Python requests.post提交JSON报400 Bad Request错误排查

问题根因
  • 代码存在两处核心错误,直接触发400报错:
    1. 多余的引号替换逻辑:标准JSON语法要求键名、字符串值必须使用双引号包裹,你执行data = data.replace('"',"'")把所有双引号换成单引号,本身就生成了不符合规范的非法JSON格式。
    2. 传参方式错误:requests.post的json参数接收Python原生字典/可序列化对象时,会自动完成JSON序列化并设置匹配的请求头;如果你传入提前序列化好的字符串,requests会对这个字符串做二次转义序列化,最终发送的请求体是被额外包裹的字符串,而非你预期的{"mission_id": "xxx"}结构。
  • 你用print打印参数看不出差异,是因为控制台打印不会展示二次序列化的转义字符,也不会直观区分单/双引号的语法差异,肉眼观测一致不代表实际HTTP请求体一致。
  • 硬编码字典版本可以正常运行,正是因为直接传入了原生字典,没有多余的序列化、引号替换操作,requests自动完成了符合规范的请求构造。
修复方案

直接移除多余的手动序列化、引号替换逻辑,把原生字典传给json参数即可,修复后的代码如下:

import requests

def post_mission(host, headers):
    # 直接构造原生字典,不需要提前调用json.dumps,也不要做引号替换
    mission_data = {'mission_id': item_selected.variable}
    url = "mission_queue"
    resp = requests.post(host + url, json=mission_data, headers=headers)
    # 排查时可以取消下面的注释,查看真实发送的请求体,比直接print传入参数准确
    # print("实际请求体:", resp.request.body)
    return resp
排查技巧

后续排查HTTP请求参数问题时,不要只打印你传入的变量,直接打印请求对象的request.body属性,就能看到实际发出去的原始载荷,避免被控制台的格式化输出误导。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:24:34