.net RESTAPI应该在响应体中返回异常吗?

.net RESTAPI应该在响应体中返回异常吗?,.net,json,rest,.net,Json,Rest,在.NET中使用Web API的最佳实践是什么?特别是WebRESTAPI。当异常发生时,RESTAPI是否应该在响应体中返回异常 当然,我会返回500或类似的HTTP状态。但是当我用这个错误代码响应时,最佳实践是什么?或者更好的是,规范或RESTAPI对此有何规定 返回异常(我所做的) 返回空的响应体?(是的,但我们会丢失有助于调试的信息) 返回一个空的默认JSON对象?(我觉得这令人困惑) 还有别的吗 返回异常(我所做的) ->您不应按原样返回异常,因为:1)它可能包含您不希望向REST

在.NET中使用Web API的最佳实践是什么?特别是WebRESTAPI。当异常发生时,RESTAPI是否应该在响应体中返回异常

当然,我会返回500或类似的HTTP状态。但是当我用这个错误代码响应时,最佳实践是什么?或者更好的是,规范或RESTAPI对此有何规定

  • 返回异常(我所做的)
  • 返回空的响应体?(是的,但我们会丢失有助于调试的信息)
  • 返回一个空的默认JSON对象?(我觉得这令人困惑)
  • 还有别的吗
返回异常(我所做的) ->您不应按原样返回异常,因为:1)它可能包含您不希望向REST API用户公开的信息。例如,在SQL异常情况下,考虑IO异常或SQLServer信息时的文件路径,等等。2) 您将发送RESTAPI客户端不需要的信息,从而浪费带宽并序列化不必要的信息

返回空的响应体? ->没有

返回一个空的默认JSON对象? ->没有

还有别的吗?
->返回一个非常具体的错误消息(加上您认为有助于集成REST API的开发人员解决该错误的任何其他信息,或者如果您收到该错误消息,您可以跟踪该错误。毕竟,您必须在某个时候研究一些问题,因此请确保您传递的信息足以让您有所了解我有这个建议

  • 此错误需要由应用程序(API)中的某个筛选器处理。此筛选器将获得意外错误,请在http状态代码等于500的JSON中转换此错误
  • 返回的错误需要具有相同的JSON格式,如下所示:

    {
        code: 12321312,
        message: "A fatal error occurred",
        details: "An unexpected information was passed as parameter to the API."
    }
    
  • 错误格式需要提供一些信息。当您在筛选器中获得错误时,您可以使用生成的代码(错误代码,如UUID)将错误保存在数据库中然后返回JSON中的
    code
    。要有一个好的API,使用错误代码将是一个很好的特性,可以帮助您识别问题


是的,您应该在响应正文中包含异常的表示。异常将是错误的最佳解释,并且最有助于帮助用户纠正错误。我建议所有错误的响应代码为400,但400范围内的任何数字都是accep桌子

我做了一些研究,发现最常见的/标准使用这种形式的JSON结构:

{
   "error": {
      "code": "400",
      "message": "main error message here",
      "target": "approx what the error came from",
      "details": [
         {
            "code": "23-098a",
            "message": "Disk drive has frozen up again.  It needs to be replaced",
            "target": "not sure what the target is"
         }
      ],
      "innererror": {
         "trace": [ ... ],
         "context": [ ... ]
      }
   }
}
其中许多都是可选的,但在您需要的情况下,它们是可以选择的。关于此结构,重要的是错误在成员“error”下的对象中描述

这是OASIS数据标准提出的格式,似乎是最标准的选择,但目前任何标准的采用率似乎都不高


详细信息在我的博客文章

中讨论,状态代码500是“内部服务器错误”,这意味着应用程序出现了问题,消费者应该稍后再试,因为这是他们无法直接解决的问题。返回异常本身不是一件好事,因为它会暴露有关软件的信息如果是该软件的设计和实现,向消费者返回错误的希望,例如带有空JSON对象的200会诱使消费者认为一切正常。我只会返回一个没有任何内容的500,或者返回一条错误消息,上面写着“请稍后再试”.2:异常不应该从应用程序本身返回,我认为,它们应该在异常发生时处理,然后有一个全局异常处理程序,为任何未捕获的错误返回500状态代码。如果问题是由用户输入引起的,那么您应该返回一个4xx状态代码,并带有与user305类似的消息1475在他的回答第2段中描述了我的REST API。我的REST API只由我们团队中的一个团队创建的客户端使用。这不是一个完美的教条式REST API。实际上,我现在没有时间测试所有内容,所以我喜欢让系统创建并发送原始异常的想法。客户端团队更容易理解错误。但是,在pro中,是的归纳我应该覆盖它。如果你想在开发环境中保留它,那么你可以一直使用它。我觉得这个问题非常有趣,但我不明白为什么问题本身中提到了后面使用的编程语言。它应该是不相关的。我将你的解决方案移到了其他地方…是的。正确吗?因此我可以创建自己的异常,但我从不重新抛出异常,也从不将信息放入内部异常。如果可能,我会清理堆栈跟踪。目前,“加上您认为对开发人员有帮助的任何其他信息”是异常本身。当然,稍后我应该对此进行改进。