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

服务器可解析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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:59:06