代码之家  ›  专栏  ›  技术社区  ›  Henrique Barcelos

对于已处理的POST请求,最合适的HTTP状态代码是什么?

  •  0
  • Henrique Barcelos  · 技术社区  · 8 年前

    我有一个RESTfulAPI,它由另一个内部应用程序使用,该应用程序向它发布更新。

    问题是出现了一些意外的峰值,在这些时间内,请求可能需要60秒以上的时间(负载平衡器定义的限制,我无法更改)来响应,这会导致 504 Gateway Timeout 错误。

    当后一个应用程序得到这样的响应时,它将在大约10分钟后重试请求。

    这导致一些请求被处理两次,因为第一个请求成功,但花费了60秒以上。

    所以我决定用 Idempotency Keys 在请求中避免这个问题。问题是我不知道在这种情况下我应该归还什么。

    我应该坚持吗 200 OK ?我要退一些吗 4xx 代码?

    2 回复  |  直到 8 年前
        1
  •  1
  •   VoiceOfUnreason    8 年前

    一个潜在的有用参考是RFC5789,它描述了补丁方法。显然,您没有执行补丁,但错误处理是类似的。

    例如,如果您正在发送 JSON Patch document ,则可以通过包含 test operation 检查资源是否处于预期的初始状态。手术后,检查可能会失败。在这种情况下, error handling 部分将您的注意力引向 RFC 5789 --第2.2节概述了许多不同的可能情况。

    另一个灵感来源是查看描述条件请求的RFC7232。关于的部分 If-Match 包括这个宝石:

    如果匹配条件的接收值为false,则源服务器不得执行请求的方法;相反,如果源服务器已验证状态,则源服务器必须使用a)412(前提条件失败)状态代码或b)2xx(成功)状态代码之一进行响应。正在请求更改,并且最终状态已反映在目标资源的当前状态中(即,用户代理请求的更改已成功,但用户代理可能不知道,可能是因为先前的响应丢失或兼容的更改已损坏其他用户代理)。

    由此,我推断200是完全可以接受的,如果你能确定工作已经成功完成。

        2
  •  1
  •   maio290    8 年前

    我想说这很大程度上取决于你是否犯了错误。但我想说,准确的响应代码更多的是一个品味问题,而不是最佳实践。但由于我猜您拒绝了重复的请求,所以您需要报告一个错误代码,例如 409 Conflict :

    指示由于冲突而无法处理请求 在资源的当前状态下,例如 多个同时更新。

    https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_errors

    每当满足请求会导致资源冲突时。例如,当不支持级联删除时,重复条目和删除根对象。

    https://www.restapitutorial.com/httpstatuscodes.html