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

Python调用ProductHunt API发送GraphQL Post请求报400错误求助

嘿,我来帮你搞定这个400错误的问题~

问题出在哪?

Postman能成功但Python请求失败,核心原因是请求的格式或头信息和API要求不匹配。ProductHunt的GraphQL API只认JSON格式的请求体,而且要求Content-Type头必须设为application/json。你之前的写法可能踩了这两个坑:

  • 用data参数传字典时,requests默认会把它编码成application/x-www-form-urlencoded(表单格式),不是API要的JSON;
  • 即使手动转了JSON,可能没正确设置Content-Type头,导致API无法解析你的请求。

修正后的两种可行方案

方案一:用requests自带的json参数(最省心)

requests的json参数会自动帮你把字典转成JSON字符串,还会自动加上Content-Type: application/json头,一步到位:

import requests

# 替换成你的API地址和有效令牌
url = "https://api.producthunt.com/v2/api/graphql"
headerz = {
    "Authorization": "Bearer 你的ProductHunt访问令牌",
    # 其他必要头信息比如Accept可以按需添加
}

# 定义GraphQL查询
queryz = {
    "query": "{ posts(first: 1) { edges { node { id, name } } } }"
}

# 用json参数发送请求
r = requests.post(url, headers=headerz, json=queryz)
print(r.text)

方案二:手动序列化JSON并设置头

如果你想自己控制序列化过程,记得用json.dumps()转成字符串,同时必须在headers里明确指定Content-Type:

import requests
import json

url = "https://api.producthunt.com/v2/api/graphql"
headerz = {
    "Authorization": "Bearer 你的ProductHunt访问令牌",
    "Content-Type": "application/json"  # 这个头绝对不能少!
}

queryz = {
    "query": "{ posts(first: 1) { edges { node { id, name } } } }"
}

# 手动把字典转成JSON字符串
payload = json.dumps(queryz)
r = requests.post(url, headers=headerz, data=payload)
print(r.text)

额外排查小技巧

如果还是有问题,可以打印出请求的头和体,和Postman里的对比:

print("请求头:", r.request.headers)
print("请求体:", r.request.body)

这样就能一眼看出哪里和Postman的请求不一样,快速定位问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:29:55