3

我正在使用 Connexion ( https://github.com/zalando/connexion ) 来确保我的 openapi 规范得到很好的遵循,并有简单的集成点来将我的路由连接到底层函数。

在任何情况下,来自 Connexion 的默认错误响应都是遵循HTTP API 的问题详细信息RFC 的 json 响应。即以下格式,例如:

{
    "detail": "None is not of type 'object'",
    "status": 404,
    "title": "BadRequest",
    "type": "about:blank"
}

但是,我想将发送的所有错误的格式更改为:

{
    error: {
        code: 400,
        message: 'BadRequest',
        detail: 'ID unknown'
        innererror: {...}
    }
}

我找不到任何方法来拦截每个错误以更改返回的格式。我知道我可以扩展类并在其构造函数中connection.exception.ProblemException向参数添加一个字典,但是对于任何错误,例如,我无法拦截它。ext400

所以,我知道可以为特定的错误代码添加错误处理程序,例如:

app.add_error_handler(404, error.normalize)
app.add_error_handler(400, error.normalize)

但是,对于404处理程序,我设法成功拦截了错误。但是对于400(例如 json 验证错误) - 拦截不起作用。

如何拦截从 Connexion 发送的每个错误并更改 json 格式,即使它只是将其扩展为:

{
    "detail": "Could not find page",
    "error": {
        "code": 404,
        "message": "Could not find requested document."
    },
    "status": 404,
    "title": "NotFound",
    "type": "about:blank"
}

我使用带有“龙卷风”服务器的 Connexion。

提前致谢。汤姆

4

1 回答 1

2

使用最新版本(connexion==2.5.1)这对我有用:

from connexion import ProblemException
[...]

connexion_app.add_error_handler(400, render_http_exception)
connexion_app.add_error_handler(404, render_http_exception)
connexion_app.add_error_handler(ProblemException, render_problem_exception)

我的异常处理函数:

from flask import jsonify


def render_http_exception(error):

    resp = {
        'error': {
            'status': error.name,
            'code': error.code,
            'message': error.description,
        }
    }

    return jsonify(resp), error.code


def render_problem_exception(error):

    resp = {
        'error': {
            'status': error.title,
            'code': error.status,
            'message': error.detail,
        }
    }

    return jsonify(resp), error.status

您可以轻松地将其更改为您的格式。

于 2020-01-30T14:03:26.653 回答