编辑:我不再完全同意这个观点,现在建议使用错误代码409,但我会保留我的答案,因为我的原始答案是人们赞同的。请参见底部以了解改变我的想法的原因。只有在您同意我的原始答案时才点赞:
我会选择422 Unprocessable Entity
,用于在请求无法被处理但问题不在语法或身份验证方面时使用,请参见RFC 9110:
422(无法处理的内容)状态码表示服务器理解请求内容的内容类型(因此,415(不支持的媒体类型)状态码不合适),并且请求内容的语法是正确的,但是它无法处理包含的指令。例如,如果XML请求内容包含形式良好(即语法上正确),但语义上错误的XML指令,则可以发送此状态代码。
作为反对其他答案的论据,使用任何非4xx
错误代码都将意味着这不是客户端错误,而显然是。没有符合规范的理由使用非4xx
错误代码来表示客户端错误。
看起来409 Conflict
是最常见的答案,但是根据规范,这意味着资源已经存在,您请求的操作与其当前状态不兼容。如果您发送一个POST
请求,例如使用已经被占用的用户名,它实际上并没有与目标资源冲突,因为目标资源(您正在尝试创建的资源)甚至还不存在。这主要是版本控制的错误,当存储的资源版本与客户端在其请求中假定的资源版本之间存在冲突时。
值得一提的是,当您尝试创建一个已经存在的仓库名称时,GitHub也会使用422作为状态码。
编辑:HTTP现在通过RFC 9110将错误422标准化了!它不再只是WebDAV的一部分。
我改变主意的原因:
在阅读新的RFC 9110时,我意识到我以前对错误409的解释是错误的。
409(冲突)状态码表示由于目标资源的当前状态与请求存在冲突,无法完成请求。在用户可能解决冲突并重新提交请求的情况下使用此代码。服务器
应生成包含足够信息的内容,以便用户能够识别冲突的来源。
这并不限制错误的意图只针对版本控制,正如我最初认为的那样。它将409错误泛化为任何类型的冲突。我仍然认为422错误适用于此处,但是因为409错误比422错误更具体(而且,“冲突”比“无法处理的实体”更有效地向人类传达了错误的语义),所以我建议使用409错误。
关于错误代码409的充分论据,请参见this answer。简而言之,有冲突的“目标资源”实际上是您要发布的资源集合,而不是您正在创建的资源,这是符合规范的解释(该答案详细阐述了原因)。如果您同意该答案,请为其点赞,而非本答案!
(注:我改变主意时我的投票数为31,因此现在这个答案有多少更多/更少的投票应该有助于衡量多少人仍然同意/不同意我的旧答案,尽管我已经进行了编辑。)