request.get_json() 为什么返回 None?怎么正确接收 JSON 请求体?
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
最常见原因:请求头的 Content-Type 不是 application/json。
Flask 只有在 Content-Type: application/json 时才解析 body 为 JSON;很多请求工具默认发 text/plain 或 application/x-www-form-urlencoded,于是 request.get_json() 返回 None。
错误示例(前端最常见的错法):
// fetch 没设 Content-Type,或设错
fetch("/api", { method: "POST", body: JSON.stringify({name: "x"}) })
// 后端 request.get_json() -> None
正确接收:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.post("/api")
def api():
data = request.get_json(silent=True) # 解析失败返回 None,不报 400
if data is None:
return jsonify({"error": "请求体必须是 JSON,且 Content-Type 为 application/json"}), 400
return jsonify({"received": data})
前端要配套:
fetch("/api", {
method: "POST",
headers: {"Content-Type": "application/json"}, // 关键!
body: JSON.stringify({name: "x"}),
})
其他导致 None 的场景与对策:
1. 请求体为空 → 检查是否真发了 body。
2. 用 requests 测试时:requests.post(url, json={"a":1})(传 json= 会自动带对 Content-Type;传 data= 字符串则不会)。
3. request.json 和 request.get_json() 等价,都受 Content-Type 限制。
4. 强制解析(不推荐,绕过标准):request.get_json(force=True)——会让格式错误的请求也难以发现。
调试建议: 先 print(request.headers) 看 Content-Type,再 print(request.data) 看 body 原文。
回复
0 条回复