【问题标题】:REST API Error code after POSTing resource with invalid FK使用无效 FK 发布资源后的 REST API 错误代码
【发布时间】:2017-04-13 13:43:37
【问题描述】:

我正在设计一个 REST API,它有一个与另外两个资源相关的 Banner 资源:PlaceholderPage

虽然与Placeholder 的关系可以是null,但Banner 必须与Page 相关。业务规则定义页面始终是独立创建的。然后,对于新的Banner 资源,页面确实存在,并且可以将页面的 id 作为参数传递。这同样适用于Placeholder,尽管这可能是null

所以,我决定也可以独立创建Banner 资源(而不是嵌套资源),如下所示:

POST https://api.example.com/banners
{
  "name": "banner's name",
  "page": "PAGE_ID",
  "placeholder": "PLACEHOLDER_ID",

  ... other parameters
}

如果提供的pageplaceholder 不存在,API 应该返回什么错误代码?

我返回的是 HTTP 404,但感觉很奇怪。我想过 409,但这看起来不像是冲突。

PD:如果我将嵌套 URL 用作 POST /pages/<page_id>/banners,则 404 对于不存在的 page 是有意义的,但对于 placeholder 仍然存在同样的问题。

【问题讨论】:

  • @CássioMazzochiMolin 这在以 post 请求正文的形式传递参数时可能被视为重复,但在使用 POST /pages/page_id/banners 时不会被视为重复。并且您是否使用其中一种取决于您希望如何访问资源。所以这不是完全重复的。
  • @andih 我又读了一遍这个问题,但我仍然认为它是重复的。 OP 关心请求正文中发送的 ID。对于在 URL 中发送的那些,404 将完成问题中提到的 OP 的工作。
  • @CássioMazzochiMolin 只要您首先想到的是固定/给定的横幅资源。作者似乎不确定这是否是正确的形式,因为他提出了第二种方式。对于第二种方法,他并不真正知道如何处理占位符。还可以解释为什么要使用一种或其他方法以及如何将占位符添加到第二种方法中,....
  • @andih 来自@CássioMazzochiMolin 在另一篇文章中的回答,我得出结论,使用POST /pages/<page_id>/banners 时,如果page_id 不存在,则会返回404,而如果页面是好的,但placeholder 没有,将返回 422。您有替代解决方案吗?
  • 我正在重新提出问题,但这应该是要走的路。是什么阻止您采用这种方法?

标签: rest restful-url api-design


【解决方案1】:

假设您要使用POST /banners 创建横幅资源并且该横幅资源具有

  • 必需的page 属性,其值必须是现有的 PAGE_ID
  • 可选的placeholder 属性,其值必须是现有的PLACEHOLDER_ID
  • 以及名称和其他属性 我认为也必须控制

在帖子 /banners 上返回 404 不是一个好主意

消费者可以提供从无到所有无效属性。按照你的想法,会给出类似的东西:

  • 如果只有 page 无效,您将返回 404
  • 如果只有 placeholder 无效,您将返回 404
  • 如果 pageplaceholder 都无效,则必须返回 404 指示这两个值都无效
  • 如果其他属性无效,您可能会返回 400 Bad Request。
  • 如果page 和/或placeholder 和其他一些属性无效,返回哪个状态? 404 还是 400?

这有点复杂和不一致,因此对于 API 的使用者来说并不是真正可用的。

400 Bad Request 是帖子/横幅的更好解决方案

处理此用例的最佳方法是将提供的资源中所有可能的错误视为基本Client Error,因此使用400 Bad Request 状态。响应正文将包含对每个无效属性的每个错误的描述。

但是使用 POST /pages/page_id/placeholders/placeholder_id/banners 有一个更简洁的解决方案

POST /pages/<page_id>/banners 几乎是一个好主意,您只需要进一步推动它。

似乎banner 进入了placeholder,而page 中的placeholder。如果是真的,您可以发送POST /pages/<page_id>/placeholders/<placeholder_id>/banners 来创建横幅。

  • 如果 page_id 无效,则返回 404(表示“找不到页面”)
  • 如果 page_id 有效但 placeholder_id 无效,则返回 404(表示“未找到占位符”)
  • 如果 page_idplaceholder_id 有效但横幅中的属性无效,则返回 400 Bad Request(指示哪些值无效)

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2013-03-01
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多