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

Restful API-JSON响应,带有单个或所有错误,json,rest,error-handling,Json,Rest,Error Handling,我当前的项目是restful API,它验证创建新用户的POST请求,可能会发生多个错误(HTTP状态): 未设置用户名(400 BADDREQUEST) 已使用用户名(409冲突) 服务器无法建立数据库连接(500内部服务器错误) 我是否应该立即发回这样的JSON响应 { “状态”:400, “消息”:“未设置用户名” } 如果检测到错误,或者如果我像下面这样累积所有错误是否更好: { "status": <HTTP STATUS CODE>, "errors"

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

  • 未设置用户名(400 BADDREQUEST)
  • 已使用用户名(409冲突)
  • 服务器无法建立数据库连接(500内部服务器错误)
  • 我是否应该立即发回这样的JSON响应

    {
    “状态”:400,
    “消息”:“未设置用户名”
    }
    
    如果检测到错误,或者如果我像下面这样累积所有错误是否更好:

    {
        "status": <HTTP STATUS CODE>,
        "errors": [
            {"message": "Username is not set."},
            {"message": "Can't access the database."}
        ]
    }
    
    {
    “地位”:,
    “错误”:[
    {“消息”:“未设置用户名。”},
    {“消息”:“无法访问数据库。”}
    ]
    }
    

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

    我认为如果您预见到一个请求中需要多个错误,那么第二个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": [ ... ]
          }
       }
    }
    
    要放置的多个错误将是“details”数组中的单个元素。使用此结构,您仍然需要一些错误的总体摘要,但是详细信息将包含您想要的任何单个错误消息

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

    这也符合,因为它要求错误是“error”成员中的对象,并且您有代码和消息

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


    有关详细信息,请参阅我在

    上的博客文章。您是否看到自己收集异常?通常情况下,我会想象,一个例外被处理,而不是一个表演停止或其停止请求。我无法想象收集异常。也许我应该在每次出现错误时返回一个错误响应。但是为什么异常应该停止请求呢?如果有效负载无效,我将不会将用户添加到数据库中。如何在一个请求中获得多个错误?假设我得到一个已使用用户名而不是字母数字的请求。第一次验证检查将失败。。。我猜是字母数字支票。它不会去DB查找它。这就是一次发送多个错误的好处,但是在第二个JSON中有不同的状态代码。但我会坚持每个请求一个错误的方法。是的,我同意,因为你不会遇到两个错误。这就是为什么我在回答中提到“如果你预见到在一个请求中需要多个错误”。如果不符合该标准,则继续使用第一个标准。