【问题标题】:HTTP Status code for PUT with mysql id.带有 mysql id 的 PUT 的 HTTP 状态代码。
【发布时间】:2019-01-28 02:35:40
【问题描述】:

我们有一个 PUT 端点,它使用自动递增的 MYSQL id 更新一行。如果我们在请求正文中指定 id,如更改 id 值,端点不会更改 id(这是正确的行为)。但它也返回 200,因为技术上没有验证失败。这应该返回 200 吗?还是应该是 400 或 403?

【问题讨论】:

  • 在我看来完全不会改变任何事情的语义。我个人会返回 400。403 主要是关于缺少权限,而不是关于错误的请求。
  • 我不清楚你看到了什么以及你想要什么。你发送一个 ID 来改变一些东西,但它没有改变,这是正确的行为吗?
  • 它将给定 id 的给定列更改为给定值,但您可以发送一个请求,在该请求中您可以尝试更改 id 列本身,但被拒绝。我就是这么理解的。错误 400 表示客户端出错,403 表示在没有适当权限的情况下尝试做某事,200 表示一切正常。在我看来,未经授权的人越少知道出了什么问题,服务器就越安全。真的取决于情况......它是什么 API,谁使用它,它是如何使用的等等。
  • 返回值应该反映PUT 操作的结果。我是否正确理解您的 PUT 操作“成功”?那么 200 是正确的返回码。否则,如果操作在逻辑上“失败”,则可以返回相应的错误。例如,如果未找到 id,请参阅在 PUT 中返回 404:stackoverflow.com/questions/10727699/…
  • @FlashThunder - 我们的 QA 团队正在测试他们试图更改 id 列本身的流程。更改没有发生,这很好,因为我们不想更改行的 id。但是 API 返回 200。这是正确的状态码还是应该是 400?

标签: http http-status-codes


【解决方案1】:

如果我们在请求体中指定 id,如更改 id 值,端点不会更改 id(这是正确的行为)。

如果负载中接收到的 id 与数据库中存储的 id 匹配并且更新成功,则服务应返回successful status code,例如204200

另一方面,如果在负载中接收到的 id 与存储在数据库中的 id 不匹配,我会理解为client error。而409 似乎是一个合理的选择:它用于表示请求与服务器上资源的当前状态冲突。有效载荷中的id和数据库中的id之间的不匹配是冲突的。

查看409 状态码是如何在RFC 7231 中定义的:

6.5.8. 409 Conflict

409(冲突)状态码表示请求无法 由于与目标的当前状态冲突而完成 资源。此代码用于用户可能 能够解决冲突并重新提交请求。服务器 应该为用户生成一个包含足够信息的有效载荷 认清冲突的根源。 [...]

响应应包含所有必要的信息,以便客户端识别冲突的来源,然后能够重新提交请求。对于在 Web API 中报告问题,我建议您查看RFC 7807

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2019-04-25
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多