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

Python requests设置请求头后POST请求返回400错误如何解决

问题根因

你手动设置请求头Content-Type: application/json时,传给requests.post()的data参数是原生Python字典,requests默认会将字典按application/x-www-form-urlencoded表单格式编码传输,不会自动转成JSON格式。服务端收到请求后,根据你声明的Content-Type尝试按JSON格式解析请求体,发现实际内容格式不匹配,解析失败就会返回400 Bad Request。
当你传入空请求头时,requests会自动根据传入的参数类型匹配对应的Content-Type:传字典给data参数时,会自动将Content-Type设为application/x-www-form-urlencoded,请求头和实际请求体格式一致,服务端可以正常解析,所以请求能成功。

修复方案

两种写法二选一即可,优先推荐第一种更简洁:

  • 发送JSON格式请求时,直接使用json参数传字典,不需要手动设置Content-Type请求头。requests会自动完成字典到JSON字符串的序列化,同时自动加上正确的Content-Type: application/json请求头。
import requests

API_ENDPOINT = "https://reqres.in/api/users"
data = {"name": "Name1", "job": "job1"}

full_output = requests.post(url=API_ENDPOINT, json=data)
print("response status", full_output.status_code)
print("response", full_output.text)
  • 如果确实需要手动设置JSON相关的Content-Type请求头,需要先手动将Python字典序列化为JSON字符串,再传给data参数,保证格式和声明的Content-Type匹配。
import requests
import json

API_ENDPOINT = "https://reqres.in/api/users"
data = {"name": "Name1", "job": "job1"}
headers = {'Content-Type': 'application/json'}

full_output = requests.post(url=API_ENDPOINT, headers=headers, data=json.dumps(data))
print("response status", full_output.status_code)
print("response", full_output.text)

日常使用requests发送POST请求时,非特殊定制场景不需要手动设置Content-Type请求头:

  • 发送普通表单数据:将字典传给data参数即可,requests自动处理编码和请求头
  • 发送JSON数据:将字典传给json参数即可,requests自动完成序列化和请求头配置
    手动硬写Content-Type很容易出现请求头声明格式和实际请求体格式不匹配的问题,就是触发本次400错误的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:15:45