对于损坏的有效负载(校验和失败),最合适的 HTTP 错误代码是什么?

What's the most appropriate HTTP error code for a corrupted payload (checksum failure)?

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

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

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

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

我不知道这种情况的标准或特定错误编号,但通常我会使用 415 或 500。由于您被限制使用这些选项,我会使用 501。从技术上讲,501 是"not implemented" 但它用于服务器无法识别请求或服务器无法满足请求的情况。您可能会争辩说校验和错误导致服务器无法满足请求。

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

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

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

419 Checksum failed

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

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

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

400 Bad Request

对我来说,损坏的数据是指由于数据传输引起的语法错误,语义正确但句法错误。

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