Restful API - 带有单个或所有错误的JSON响应

时间:2015-05-15 18:06:41

标签: json rest error-handling

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

  1. 用户名未设置(400 BadRequest)
  2. 用户名(409 Conflict)
  3. 服务器无法建立数据库连接(500内部服务器错误)
  4. ...
  5. 我是否应该立即发回这样的JSON响应

    new_educ

    如果检测到错误,或者如果我累积所有错误会更好:

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-1)

经过研究,最好的(最标准的)响应方式是这种形式的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对象以及异常。

有关详细信息,请参见我在Error Handling in JSON REST API上的博客文章