如何在Python Flask RestApi中识别非JSON格式HTTP请求?
嘿,刚好我之前做Flask REST API的时候也遇到过这个需求,给你分享几个实用的解决方案,帮你精准识别非JSON格式的请求:
方法一:检查请求的Content-Type头
Flask的request对象自带content_type属性,你可以通过它判断请求是否声明为JSON类型。不过要注意,有些客户端会在Content-Type里加额外参数(比如application/json; charset=utf-8),用startswith判断会比直接全等匹配更稳妥。
示例代码:
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/api/your-endpoint', methods=['POST']) def handle_request(): # 检查Content-Type是否为JSON类型 if not request.content_type or not request.content_type.startswith('application/json'): return jsonify({"error": "仅支持JSON格式的请求"}), 415 # 415是标准的「不支持媒体类型」状态码 # 尝试解析JSON数据 try: json_data = request.get_json() # 这里写你的业务逻辑 return jsonify({"message": "请求处理成功", "data": json_data}), 200 except Exception as e: return jsonify({"error": "JSON格式解析失败"}), 400
方法二:利用
request.get_json()的返回值 request.get_json()方法在两种情况下会返回None:一是请求的Content-Type不是JSON,二是请求体的JSON格式不合法。你可以直接通过这个返回值来判断,但如果要区分「类型不对」和「格式错误」,还是建议结合Content-Type检查一起用。
示例代码:
@app.route('/api/your-endpoint', methods=['POST']) def handle_request(): json_data = request.get_json() if json_data is None: return jsonify({"error": "请发送合法的JSON格式请求"}), 400 # 业务逻辑处理 return jsonify({"message": "请求成功", "received": json_data}), 200
方法三:自定义装饰器(多接口场景推荐)
如果你的API有很多接口都需要JSON检查,写个装饰器可以避免重复代码,让代码更整洁。
示例代码:
from functools import wraps def require_json(f): @wraps(f) def decorated(*args, **kwargs): # 先检查Content-Type if not request.content_type or not request.content_type.startswith('application/json'): return jsonify({"error": "仅支持JSON格式请求"}), 415 # 再解析JSON json_data = request.get_json() if json_data is None: return jsonify({"error": "JSON格式解析失败"}), 400 # 把解析好的JSON直接传给视图函数 return f(json_data, *args, **kwargs) return decorated # 使用装饰器 @app.route('/api/your-endpoint', methods=['POST']) @require_json def handle_request(json_data): # 直接使用已经校验好的json_data return jsonify({"message": "处理完成", "data": json_data}), 200
额外小提示:
- 状态码尽量用标准值:415对应「Content-Type不支持」,400对应「JSON格式错误」,这样客户端能更清晰地定位问题。
- 如果需要严格校验JSON结构,可以搭配
pydantic这类库一起使用,进一步提升接口的健壮性。
内容的提问来源于stack exchange,提问作者prashant THE ROCK
相关产品推荐
相关产品推荐

