普通网友 2025-06-26 18:10 采纳率: 98%
浏览 34
已采纳

Flask接口返回415 Unsupported Media Type错误如何解决?

在使用 Flask 开发 Web 接口时,经常会遇到客户端请求返回 415 Unsupported Media Type 错误。该错误通常表示服务器无法处理请求中指定的媒体类型(Content-Type)。常见原因是客户端发送了服务器不支持的数据格式,例如未正确设置 Content-Type 请求头,或 Flask 未配置对应的请求解析器。解决方法包括:检查并设置正确的 Content-Type(如 application/json)、确保 Flask 安装了对应解析扩展(如 Flask-RESTful、Flask-JWT 等),或手动解析请求数据。掌握这些调试技巧有助于快速定位并修复接口兼容性问题。
  • 写回答

1条回答 默认 最新

  • 小丸子书单 2025-06-26 18:10
    关注

    一、理解 415 Unsupported Media Type 错误

    在使用 Flask 开发 Web 接口时,客户端请求返回 415 Unsupported Media Type 是一个常见的 HTTP 状态码。该错误表示服务器无法处理请求中指定的媒体类型(Content-Type),通常是因为服务器不支持客户端发送的数据格式。

    常见表现形式包括:

    • 客户端发送 JSON 数据但未设置正确的 Content-Type 头。
    • Flask 应用未安装或配置相应的解析库,如 Flask-RESTful。
    • 使用了非标准或自定义的媒体类型,导致 Flask 默认解析器无法识别。

    二、问题分析流程图

    graph TD
        A[收到客户端请求] --> B{是否有 Content-Type 请求头?}
        B -- 否 --> C[返回 415 错误]
        B -- 是 --> D{是否为服务器支持的类型?}
        D -- 否 --> E[返回 415 错误]
        D -- 是 --> F[正常解析并处理请求]
        

    三、从浅入深的问题排查与解决方法

    1. 检查请求头中的 Content-Type

    最常见的问题是客户端没有正确设置 Content-Type 请求头。例如,当客户端发送 JSON 数据时,应确保头部包含:

    Content-Type: application/json

    否则 Flask 将无法识别数据格式,从而引发 415 错误。

    2. 使用 Flask 内置的 request.get_json() 方法

    Flask 提供了便捷的方法来解析 JSON 请求体:

    @app.route('/example', methods=['POST'])
    def example():
        data = request.get_json()
        return jsonify(data)

    如果请求不是 JSON 格式,或者未设置正确的 Content-Type,将自动返回 415 错误。

    3. 安装并集成 Flask-RESTful 扩展

    如果你正在开发 RESTful API,推荐使用 Flask-RESTful 扩展。它提供了更强大的请求解析能力:

    from flask_restful import reqparse
    
    parser = reqparse.RequestParser()
    parser.add_argument('username', type=str, required=True, help='Username is required')

    Flask-RESTful 能更好地处理不同类型的输入,并自动验证 Content-Type。

    4. 自定义请求解析逻辑

    对于非标准的媒体类型,可以手动实现解析逻辑:

    @app.before_request
    def parse_custom_media_type():
        if request.mimetype == 'application/custom':
            request.custom_data = json.loads(request.data)

    这种方式适用于需要支持特定格式(如 XML、YAML)或企业内部自定义格式的情况。

    四、调试技巧与建议

    步骤操作目的
    1检查请求头确认 Content-Type 是否正确
    2打印 request.headers查看实际接收到的请求头内容
    3使用 Postman 或 curl 测试接口模拟请求并观察响应
    4启用 Flask 的调试模式获取更详细的错误信息
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 6月26日