使用Python的requests.post()调用POST API时遇500内部服务器错误求助
Hey there, let's figure out why adding the Authorization header is triggering a 500 internal server error for your POST request. Here are the most likely causes and how to check them:
1. 请求体格式不匹配(高概率原因!)
看你的代码,你在requests.post里用了data=payload,但同时设置了Content-Type: application/json请求头。
- 当你把Python字典传给
data=payload时,Requests会自动把它编码成application/x-www-form-urlencoded(表单格式),而不是JSON格式。 - 没有
Authorization头时,服务器直接返回401,根本不会去解析请求体;但添加合法授权后,服务器会按照请求头尝试把请求体解析成JSON,结果拿到的却是表单数据——这种格式不匹配很容易导致服务器崩溃,抛出500错误。
优先修复这个问题:把data=payload替换成json=payload:
response = requests.post(url=urlsales, json=payload, headers=headers)
这个参数会让Requests自动把payload序列化成JSON字符串,同时也会自动设置正确的Content-Type头(当然你也可以保留自己手动设置的头)。
2. Basic Auth凭证格式无效
Basic认证要求凭证字符串是username:password(注意中间的冒号分隔符)经过base64编码后的结果。如果你的xxxx==编码不正确,服务器可能无法正常处理,进而抛出500错误,而不是预期的401未授权。
验证你的编码字符串:
用下面的代码解码你的token,检查是否符合username:password的格式:
import base64 decoded_cred = base64.b64decode("xxxx==").decode("utf-8") print(f"解码后的凭证:{decoded_cred}")
如果输出不是有效的用户名:密码格式(比如缺少冒号、有多余字符,或者用户名/密码本身错误),那这就是问题所在。重新编码正确的username:password字符串即可。
3. 服务器端处理逻辑问题
500错误本质上说明服务器在处理请求时遇到了意外问题。哪怕你的请求是正确的,服务器在处理已认证请求时也可能存在bug:
- 服务器的授权验证逻辑可能有问题,解析
Authorization头时触发了未处理的异常。 - 已认证请求可能会触发额外的校验(比如payload schema、权限检查),而这些校验逻辑没有被妥善处理,导致崩溃。
排查这个问题:
- 用
curl工具测试相同请求,排除Python代码本身的问题:
如果还是返回500,拿着错误码curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Basic xxxx==" \ -d '{"key": "value"}' \ https://你的API地址.com500.45.001联系API维护者——他们的日志里应该有详细的错误原因。
4. 已认证请求专属的Payload问题
未认证时,服务器在401阶段就停止处理了,不会校验你的payload;但认证通过后,服务器可能会对payload执行更严格的校验(比如必填字段、数据类型),而你当前的payload不符合要求。如果服务器对无效payload的处理不优雅,就会抛出500而不是400 Bad Request。
检查你的Payload:
- 对照API文档,确保payload包含所有必填字段,且格式完全符合要求。
- 尝试发送一个文档里的最小化合法payload,加上
Authorization头测试是否能正常响应。如果可以,说明你原来的payload存在问题。
内容的提问来源于stack exchange,提问作者zzz

