.net RESTAPI应该在响应体中返回异常吗?
在.NET中使用Web API的最佳实践是什么?特别是WebRESTAPI。当异常发生时,RESTAPI是否应该在响应体中返回异常 当然,我会返回500或类似的HTTP状态。但是当我用这个错误代码响应时,最佳实践是什么?或者更好的是,规范或RESTAPI对此有何规定.net RESTAPI应该在响应体中返回异常吗?,.net,json,rest,.net,Json,Rest,在.NET中使用Web API的最佳实践是什么?特别是WebRESTAPI。当异常发生时,RESTAPI是否应该在响应体中返回异常 当然,我会返回500或类似的HTTP状态。但是当我用这个错误代码响应时,最佳实践是什么?或者更好的是,规范或RESTAPI对此有何规定 返回异常(我所做的) 返回空的响应体?(是的,但我们会丢失有助于调试的信息) 返回一个空的默认JSON对象?(我觉得这令人困惑) 还有别的吗 返回异常(我所做的) ->您不应按原样返回异常,因为:1)它可能包含您不希望向REST
- 返回异常(我所做的)
- 返回空的响应体?(是的,但我们会丢失有助于调试的信息)
- 返回一个空的默认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中的
。要有一个好的API,使用错误代码将是一个很好的特性,可以帮助您识别问题code
{
"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中,是的归纳我应该覆盖它。如果你想在开发环境中保留它,那么你可以一直使用它。我觉得这个问题非常有趣,但我不明白为什么问题本身中提到了后面使用的编程语言。它应该是不相关的。我将你的解决方案移到了其他地方…是的。正确吗?因此我可以创建自己的异常,但我从不重新抛出异常,也从不将信息放入内部异常。如果可能,我会清理堆栈跟踪。目前,“加上您认为对开发人员有帮助的任何其他信息”是异常本身。当然,稍后我应该对此进行改进。