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

Python发送POST请求失败但curl成功,问题出在哪里?

问题分析与解决方案

你的核心问题是请求体格式与声明的Content-Type不匹配:

  • 用requests.post的data参数传递字典时,requests会自动把字典编码为application/x-www-form-urlencoded格式,即便你手动设置了Content-Type: application/json,服务器收到的请求体是表单格式,和头信息矛盾,因此返回400错误。
  • 而curl的-d参数传递的是原生JSON字符串,格式完全符合服务器要求,所以请求成功。

正确实现方式(二选一)

方式1:使用json参数传递字典(推荐)

requests会自动将字典序列化为JSON字符串,并自动设置Content-Type: application/json,无需手动在headers中声明:

import requests

url = 'http://example.com/endpoint'

data = {
  "doc": "This is my doc.",
  "date": "2022-12-02"
}

headers = {
    "Accept": "application/json",
    "id": "12345",
    "key": "67890"
}

response = requests.post(url, json=data, headers=headers)

方式2:手动序列化JSON后用data参数传递

如果需要手动控制序列化过程,可先用json.dumps()把字典转为JSON字符串,再通过data参数传递:

import requests
import json

url = 'http://example.com/endpoint'

data = {
  "doc": "This is my doc.",
  "date": "2022-12-02"
}

headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "id": "12345",
    "key": "67890"
}

response = requests.post(url, data=json.dumps(data), headers=headers)

排查你用json参数仍报错的可能原因

如果已经尝试过json参数但问题依旧,检查以下几点:

  • 是否同时传递了data和json参数?requests会优先使用data,导致格式错误
  • headers中是否存在其他干扰字段?比如重复设置了Content-Type相关头
  • 确认data字典的结构、字段值和curl中的JSON完全一致,无语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:50:42