使用JSON API处理具有多个属性或参数的错误

时间:2017-09-15 00:19:16

标签: api-design json-api

JSON API指定应单独列出属性/参数上的多个错误。处理一次涉及多个参数的单个错误的最佳方法是什么?

例如,假设端点接受bidfold参数,但不同时接受两者(它们是互斥的)。如果提交了两个参数(GET /endpoint?bid=100.00&fold=muck),那么错误响应应该是什么?

列出错误两次,每个属性一次?

{
  "errors": [
    {
      "status": "400",
      "source": { "parameter": "bid" },
      "detail": "Cannot accept both 'bid' and 'fold' parameters."
    },
    {
      "status": "400",
      "source": { "parameter": "fold" },
      "detail": "Cannot accept both 'bid' and 'fold' parameters."
    }
  ]
}

结合属性?

{
  "errors": [
    {
      "status": "400",
      "source": { "parameter": ["bid", "fold"] },
      "detail": "Cannot accept both 'bid' and 'fold' parameters."
    }
  ]
}

为整个请求设置一个更高级别的错误?

{
  "errors": [
    {
      "status": "400",
      "source": { "pointer": "/data" },
      "detail": "Cannot accept both 'bid' and 'fold' parameters."
    }
  ]
}

其他一些方式?

2 个答案:

答案 0 :(得分:3)

TL; DR版本:第一个可能是正确的。

JSONAPI规范和论坛都没有详细说明如何格式化互斥参数/数据的错误。它 this

  

服务器可以选择在遇到问题时立即停止处理,或者可以继续处理并遇到多个问题。例如,服务器可能会处理多个属性,然后在单个响应中返回多个验证问题。

要重新解释您的问题,您提出的问题是这样的:"如果您在使用第一个参数时包含第二个禁止的参数,是单个错误还是多个错误?& #34;

这表明,在一种观点中,只有一个错误 - Cannot accept 'bid' when using 'fold'(或者在相反的方向,如果您关心排序),并且该错误只会指向一个参数,因为您可以&在您处理完其中一个参数之前,会遇到该错误。

更实际的是,你要检查你是否同时拥有它们,并且遇到错误不是因为你有一个参数然后遇到另一个,而是因为你知道你有这两个参数而现在必须处理有这个问题。这仍然是一个错误,指向两个参数(这是你的问题的前提)。

JSONAPI spec for Error Objects表示:

  

参数:一个字符串,指示导致错误的URI查询参数。

由于您必须使用string(不是Array)来指示错误的来源,并且错误在参数而不是请求正文中,您可以选择将其视为我在上面列出的只是一个参数引起的错误,或者同样归因于这两个参数的错误,就像你在第一个例子中所做的那样。

我个人更喜欢将此视为由查询字符串中最后一个参数引起的单个错误,但您的第一个选项可能是最正确的。

答案 1 :(得分:2)

计划A受到以下事实的影响:现在将恢复错误的完整上下文推送给调用者。例如,如果调用者修复了一个错误而另一个“神奇地”消失了 - 这可能会造成混淆。

在计划A中,您可以添加meta选项以指出交叉链接作为一些额外的帮助。

比较中的

计划B 感觉是正确的,因为它捕获了错误场景(多参数)的本质,并简洁地将它们固定下来。当然,您还需要请求API增强功能,可能需要source数组。例如:

"source" : [ {parameter...}, {parameter...} ]