Flask应用如何捕获JSON解析错误并返回自定义响应?
如何在Flask中捕获JSON解码错误并返回自定义响应
你的问题核心是Flask默认在JSON解析失败时返回通用的400页面,而你想要更友好的自定义响应。其实只需要在尝试解析JSON的代码块外层添加try-except捕获即可,具体看下面的修改示例:
修改后的完整代码
from flask import Flask, request, jsonify import json @app.route("/endpoint/", methods=['POST']) def mypostmethod(): # 先检查Content-Type(简化写法,用get避免KeyError) if request.headers.get('Content-Type') == 'application/json': try: # 解析JSON的步骤放在try块内,这一步会触发解码错误 req_data = request.get_json() # 同时处理缺少必填字段的情况 content = req_data['content'] return content except json.JSONDecodeError as e: # 自定义JSON解码失败的响应 return jsonify({ "code": 400, "message": "请求体不是有效的JSON格式", "detail": str(e) }), 400 except KeyError: # 处理缺少content字段的情况 return jsonify({ "code": 400, "message": "请求缺少必填字段'content'" }), 400 else: # 处理Content-Type不符合要求的情况 return jsonify({ "code": 415, "message": "仅支持application/json格式的请求体" }), 415
关键说明:
- try块的位置:必须包裹
request.get_json()(或request.json,两者等价)的调用,因为这一步是Flask尝试解析请求体JSON的核心环节,格式错误时会直接抛出json.JSONDecodeError异常。 - 异常分层处理:
json.JSONDecodeError:专门捕获JSON格式错误的场景(比如你遇到的单引号代替双引号的问题),返回的错误详情能帮助调用方快速定位问题。KeyError:额外捕获缺少content字段的情况,让接口的错误处理更全面,避免因为字段缺失返回通用500错误。
- 响应规范:
- 用
jsonify返回JSON格式的错误响应,比纯文本或HTML更适合API场景。 - 状态码严格遵循HTTP规范:400表示请求格式错误,415表示不支持的媒体类型(Content-Type不符合要求)。
- 用
补充:关于你的curl命令
你原来的curl命令出错是因为shell解析规则:单引号包裹的字符串里不能直接嵌套单引号(会被shell提前截断)。正确的写法有两种:
# 写法1:用双引号包裹JSON,内部双引号转义 curl -X POST "localhost:8080/endpoint/" -H "Content-Type: application/json" -d "{\"content\": \"Blah\"}" # 写法2:用单引号包裹JSON,内部用双引号(更简洁推荐) curl -X POST "localhost:8080/endpoint/" -H "Content-Type: application/json" -d '{"content": "Blah"}'
内容的提问来源于stack exchange,提问作者Saffik
相关产品推荐
相关产品推荐

