服务器可解析curl/Postman的JSON请求,但Python代码发送失败求助
解决Python requests无法正确发送JSON POST请求的问题
看起来你已经确认服务器能正常处理curl和Postman的JSON POST请求,但用Python requests库时遇到了问题——咱们先从你的curl命令入手,对应着调整requests代码,应该就能解决。
先拆解下你的curl命令里的关键要素:
- 基础认证:
--user trial:trial会自动生成Basic Auth的请求头 - 内容类型:明确指定了
Content-Type: application/json - 请求体:发送的是标准JSON字符串
{"id" : "122"}
下面是requests代码最容易踩的坑,以及对应的正确写法:
常见错误点及修复方案
1. 错误使用data参数传递JSON数据
很多人会直接写requests.post(url, data=payload),但这样requests会把字典编码成application/x-www-form-urlencoded格式(也就是表单格式),和你curl里的JSON格式完全不符,服务器自然无法正确解析。
2. 未正确配置基础认证
curl的--user是基础认证的快捷写法,requests里需要对应配置auth参数,否则服务器可能因为权限问题拒绝请求,或者返回异常。
正确的代码示例
直接用requests的json参数是最简洁且不易出错的方式,它会自动帮你完成JSON序列化和设置Content-Type头:
import requests # 基础认证信息,和curl的--user trial:trial对应 auth_credentials = ('trial', 'trial') target_url = 'http://localhost:8080/test' # 要发送的JSON数据,直接用字典即可 json_payload = {"id": "122"} # 发送POST请求 response = requests.post(target_url, auth=auth_credentials, json=json_payload) # 可以打印响应信息来验证结果 print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}")
如果你用的是较旧版本的requests(v2.4.2之前),json参数可能不支持,那可以手动序列化JSON并设置请求头:
import requests import json auth_credentials = ('trial', 'trial') target_url = 'http://localhost:8080/test' json_payload = {"id": "122"} # 手动设置Content-Type头,并把字典转成JSON字符串 headers = {'Content-Type': 'application/json'} response = requests.post( target_url, auth=auth_credentials, data=json.dumps(json_payload), headers=headers ) print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}")
排查小技巧
如果还是有问题,可以打印请求的详细信息,对比curl的请求内容:
print("请求头:", response.request.headers) print("请求体:", response.request.body)
这样就能直观看到发送的内容是不是和curl一致,快速定位问题。
内容的提问来源于stack exchange,提问作者menteith
相关产品推荐
相关产品推荐

