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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:12:27