Restful API - JSON 响应有一个或所有错误

Restful API - JSON response with single or all error(s)

我当前的项目 restful API 验证 POST 创建新用户的请求,并且可能会发生多个错误(HTTP 状态):

  1. 未设置用户名 (400 BadRequest)
  2. 用户名被占用(409冲突)
  3. 服务器无法建立数据库连接(500 内部服务器错误)
  4. ...

我是否应该像这样立即发回 JSON 回复

{
    "status": 400,
    "Message": "No username is set"
}

如果检测到错误,或者如果我像这里这样累积所有错误应该更好:

{
    "status": <HTTP STATUS CODE>,
    "errors": [
        {"message": "Username is not set."},
        {"message": "Can't access the database."}
    ]
}

最后一种方法不需要多个请求来发送有效负载。但是,如果未设置用户名(400 Bad Request)或服务器无法访问数据库(500 Internal Server Error),应该使用哪个状态码?

我认为如果您预见到一个请求中需要多个错误,那么第二个 JSON(有多个错误)是首选。进行多重错误响应的另一个好处是,作为您服务的用户,如果我返回多个错误,我可以一次解决所有错误,而不是在我得到它们时一次解决它们。

经过一些研究,最好(最标准)的响应方式是 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": [ ... ]
      }
   }
}

您要放置的多个错误将是“详细信息”数组中的单个元素。使用此结构,您仍然需要一些错误的总体摘要,但是详细信息将包含您想要的尽可能多的单个错误消息。

这是 OASIS 数据标准 OASIS OData 提出的格式,似乎是目前最标准的选项,但目前似乎没有任何标准采用率很高。

这也符合 JSON RPC 2.0 Spec,因为它要求错误是“错误”成员中的一个对象,并且您有代码和消息。

您可以在以下位置找到实现此功能的完整开源库:Mendocino JSON Utilities。该库支持 JSON 对象以及异常。

详细信息在我的博客 post Error Handling in JSON REST API

中讨论