【问题标题】:What's the most appropriate HTTP error code for a corrupted payload (checksum failure)?对于损坏的有效负载(校验和失败),最合适的 HTTP 错误代码是什么?
【发布时间】:2016-02-26 16:04:36
【问题描述】:

我正在编写一个带有一些端点的 RESTful API,客户端可以向其 PUT 或 POST 分块文件(使用 flow.js),包括元数据中的有效负载摘要。服务器还会计算摘要,如果摘要不匹配,则会抛出错误,在这种情况下,客户端应该尝试重试相同的请求而不做任何更改(至少在达到某个重试限制之前)。

似乎没有一个标准代码符合定义。最好使用什么代码?有什么符合惯例的吗?

注意:为了与此库集成,响应不能是 404、415、500 或 501,因为它们将取消较大的操作而不是重试这部分。

我也不能使用 409,因为它被用来识别尝试上传同一文件的多个副本的尝试,我认为无论如何使用 409 更好。

【问题讨论】:

  • 如果摘要不匹配,不变的重复是否会改变结果? - 400 Bad Request 表示需要修改后重新发送。
  • 没有官方的状态码告诉客户端重试(虽然 IIS 有一个非标准的449 Retry With)。我认为400 Bad Request409 Conflict 可能是你最好的选择。或者,只需编写您自己的自定义代码。
  • @RemyLebeau 虽然这些工作它们在客户端指定了一个问题。通常 500 将是正确的响应,因为服务器端存在错误,没有合适的特定消息,但受到限制。所以,正如我在回答中所解释的那样,我会选择 501
  • @MatthewVerstraete IMO 这是一个验证检查问题(客户端发送了一些东西并声称它具有一定的哈希值,而服务器计算出一些不同的东西)。因此,这可能不是服务器的错(除非它使用了错误的哈希函数),而是发送者的错,因此应该在 400-ish 范围内
  • 我相信可以公平地说问题不在服务器端,也可能不是客户端。经过一些重试后,400 响应可能是最合适的,但是当服务器想要建议未修改的重试时,似乎应该发送其他内容。我想归根结底是没有传输错误的响应范围,所以它必须嵌入客户端错误中。

标签: rest http-status-codes flow-js


【解决方案1】:

我认为当用户的相同数据出错时更合适的状态代码,比如损坏的数据是:

400 Bad Request

对我来说,损坏的数据,意味着像数据传输引起的语法错误,语义正确但语法错误。

422 无法处理的实体也可能适用。 https://www.rfc-editor.org/rfc/rfc4918#section-11.2

【讨论】:

  • 我真的很喜欢422“语法正确但语义错误”
【解决方案2】:

我不能接受 Matthew 的回答,因为它仍然暗示我不能使用的值之一 - 而且我还认为 5xx 错误在客户端或传输层中的错误不是很合适。

虽然仍在寻找更好的选择,但我现在建议(并使用)一个非标准的 4xx 错误,特别是

419 校验和失败

之所以选择该特定值,是因为它与处理具有相似性质的错误的代码接近,并且与可能是最接近的关系的 409 相似。

几天后将选出一个分析器,为社区就最佳实践方法达成共识提供机会。

【讨论】:

    【解决方案3】:

    我不知道此类情况的标准或特定错误号,但通常我会使用 415 或 500。由于您被限制使用这些选项,我会选择 501。从技术上讲,501 是“不已实现”,但它用于服务器无法识别请求或服务器无法满足请求的情况。您可能会争辩说校验和错误使服务器无法完成请求。

    如果您想查看所有选项的列表,请查看this wiki page,您可能会找到更喜欢的内容

    【讨论】:

    • 这些是我必须/不/使用的所有特定代码。任何其他 400+ 代码(也不包括 409)都是可以接受的。
    • @HonoredMule 抱歉错过阅读,让我查看错误代码并编辑答案
    • 5xx 是服务器端错误(崩溃时的错误),使用它会非常误导。
    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多