首页 文章

如何从 API 传递 domain-specific 错误以供客户端代码解析

提问于
浏览
0

我正在使用 ASP.Net Core 创建 API。 API 不公开;它仅供我们正在开发的特定 B2B/B2E 移动应用程序使用。

我需要告诉移动应用程序确切地发生了什么类型的错误,以便它可以显示有用的错误消息。状态代码本身不足以满足这一要求,因为相同的状态代码可以涵盖应该在应用程序中区分的几个不同的 domain-specific 错误。因此,执行此操作的唯一方法似乎是发送神奇的字符串,最好在 API 和移动应用程序项目引用的共享项目中定义。到现在为止还挺好。

我第一次使用 ASP.NET Web API 2(不是 Core),我的控制器返回了IHttpActionResult,我可以简单地return this.ResponseMessage(new HttpResponseMessage { StatusCode = myStatusCode, ReasonPhrase = myReasonPhrase })(我将这个创建委托给控制器上的一个简单的辅助方法,所以操作非常干净和简短)。但是,ResponseMessageResult似乎没有在 ASP.Net Core 中定义。

我以前没有 ASP.Net Core 的经验,似乎无法在任何地方找到我的用例的答案,所以我想知道如何最好地解决这个问题。想到一些可能的解决方案:

  • 使用特定原因短语在控制器中创建错误响应。这就是我之前做过的事情,看起来相当干净简单。

  • 在控制器中抛出异常(或者,最好是从控制器的依赖项中),并使用异常过滤器将其转换为具有特定原因短语的错误响应。不确定我喜欢这个,因为它可能需要我定义尽可能多的自定义异常作为我想要返回的原因代码。

  • 对于上述任何一种情况,不要将字符串放在原因短语中,而是将其放在响应主体中的对象中。似乎 heavy-handed 在原因短语中看作一个神奇的字符串就足以满足我的目的。虽然我可以为每个控制器的常规 API 响应添加Error属性,但在所有情况下都只返回ObjectResult

我不知道这些或者完全是另一种解决方案中的哪一种可能是从 ASP.Net 核心 API 传达 domain-specific 错误的合理方式。

如何通过 ASP.Net 核心 REST API 干净利落地传达 domain-specific 错误,以便客户端代码解析?

1 回答

  • 1

    我是怎么做到

    public class SerializableMessage {
        public SerializableMessage(string message)
        {
            Message = message;
        }
    
        public string Message { get; set; }
    }
    

    在我的控制器中

    try
    {
        // something that throws
    } catch (ExpectedException e)
    {
        return BadRequest(new SerializableMessage("You messed up");
    }
    

    然后,当客户端收到非 2xx 响应时,它会读出(e.g. 如果内容类型是 json)response.message

    我看到它的方式是客户端知道发生了什么,所以它需要做的就是失败或者可能显示出错的信息,因为大多数错误都是用户干预无法恢复的。

    对于模型状态错误,我将它们序列化为SerializableErrorMessage类中的Errors属性,其方式与 asp.net 核心已经完成的方式类似。这提供了指定附加消息错误字符串的选项。至于未捕获的异常,我只是让全局过滤器发送 500 响应并使用某些东西记录异常(应用程序见解)。

    看看 Controller 类上可用的方法。 Intellisense(不记得实际名称)文档与 asp.net 核心库相当不错。可以给你灵感!!

    底线是,有一个可序列化的类,包含您认为有用的属性。不要依赖魔术动态对象,我会避免上下文属性(e.g. endpoint1 返回错误 endpoint2 返回 ErrorMessage 和错误)维护噩梦记住预期的属性!

相关问题