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
相关产品推荐
相关产品推荐

