【问题标题】:REST API best practice on handling errors [closed]处理错误的 REST API 最佳实践 [关闭]
【发布时间】:2020-12-24 06:47:12
【问题描述】:

我想知道如何在内部处理 REST API 后端的错误。假设用户提供了一个不完整的请求负载、验证失败或寻找不存在的东西。对于这些情况,我们希望返回 400 或 404。

在某些框架中(仅限于我有经验的框架),我们通过抛出异常(NestJS、Spring 等)来做到这一点。但是在 Go 中,操作方法(验证、访问数据库)返回的 error 可以指示错误(if err != nil),我们可以冒泡 err 直到控制器级别并对其进行不同的处理(返回一些特定的状态、错误消息等)。

我的问题是,哪种方式(或者如果有其他首选方式)是处理后端错误的最佳方式?问题是抛出异常将显示在任何日志监控工具上,并且会显示应用程序有很多错误,即使大多数可能是 4XX 错误(我们可以过滤日志以明确找到 50X 错误),并使用 errors 返回对象对于我们拥有的每个验证功能,冒泡可能很麻烦。如果有任何解释类似主题的存储库示例或文章,我会很高兴。

谢谢!

【问题讨论】:

    标签: rest exception design-patterns error-handling


    【解决方案1】:

    我看到抛出异常的一个问题是我们可能会向用户发出一些内部错误,这可能对他们没有好处,并且还会暴露我们的实现。

    对于我们拥有的每个验证函数,使用错误返回对象可能会很麻烦。

    是的,传播错误可能很麻烦,但我认为最好将所需的错误从被调用函数传播到被调用者,让被调用者决定他们想要做什么。对于rest调用,我认为如果我们将错误从DB层传播到服务层再到rest层就可以了。

    此外,我们可以将其余层的错误包装成标准响应消息

    {
        "type": "/errors/incorrect-user-pass",
        "title": "Incorrect username or password.",
        "status": 401,
        "detail": "Authentication failed due to incorrect username or password.",
        "instance": "/login/log/abc123"
    }
    

    当我们调用Http.Handle() 时,我们可以通过调用包装函数来处理错误来做到这一点。这个post 包含示例函数ServeHTTP()

    致谢serveHTTP 函数取自 Zeynel Özdemir,响应对象示例取自 https://www.baeldung.com/

    【讨论】:

    • 感谢您的回答和解释!我同意您的观点,尤其是格式化错误响应消息。但在我看来,通过不同层传播错误对象,它添加了更多代码(用于检查)并导致详细和冗长的代码。对于 Go 和其他可以返回多个值的语言 (return result, err) 会更好,但是对于像 Java 和 TS 这样的语言,我们需要一个通用的包装器,一切都将使用包装器,甚至更多的代码 (@ 987654331@).
    • 我正在考虑第三种方式,即抛出异常但在控制器(或类似的,请参阅下面的 NestJS 的异常过滤器)级别上捕获它,处理 4XX 或 5XX 错误,将其转换并包装为一种常见的错误格式(如您的示例),并返回响应。我正在使用 NestJS,它有 exception filter 我可以利用它。您如何看待这种方法?有没有类似的模式?
    • 我也喜欢在控制器级别处理它的第三种方式,我在 java 中使用baeldung.com/exception-handling-for-rest-with-spring 实现了类似的方式。但是我在 go 中找不到类似的东西。
    猜你喜欢
    • 2016-12-26
    • 2014-11-28
    • 2011-05-30
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多