找不到父资源时,POST的正确响应状态代码是什么?


Answers:


15

404 NOT FOUND似乎是适当的响应,因为具有该ID的资源不存在。理解起来很清楚,如果a/{id}调用,您期望得到相同的响应。

409 CONFLICT在我看来,这不是更好的选择,因为在您的示例中,当未找到父资源时,您将返回409 :)。

但是请记住,最重要的一点是API中的一致性


我同意。如果要尝试写一个不存在的文件夹,是冲突还是缺少文件夹错误?在我看来,这种方式更加直观。
尼尔

“文件夹”是指不存在的路径?
Dherik

我的意思是像文件系统上的文件夹。
尼尔

您能详细说明情况吗?因为要看。如果该文件夹用于服务器,并且(无论出于何种原因)不存在,则我认为这是服务器错误(5xx)而不是客户端错误(4xx)。如果此文件夹的值由客户端传递给资源(如id),则为404。但是,如果该文件夹在正文中传递,则可能是其他任何值(412、422……表示“验证失败:不存在”)。问和讨论是一个很好的问题。
Dherik

如果您请求服务器提供路径为/nonexistent/help.html的文件,而文件夹/ nonexistent不存在,则对此只有一个明确的响应。找不到404文件!甚至可能存在一个/home/help.html,并且响应不会有所不同。显然,这是一个REST应用程序,但是我看不出逻辑会改变的原因。父级必须首先存在。
尼尔

4

除了@Dherik的答案。

URI是标识符,因此我们必须记住(/a/{id}/b是标识符)。该URI是针对WWW毫无意义,因此对于HTTP客户端。

404是正确的答案。本质上,服务器正在应答

我没有找到具有此类ID的任何资源。找不到资源 1

丢失的资源是父母还是孩子都没有关系。

开发人员可以在URI中看到层次结构和路径,而HTTP客户端则看不到。换句话说,HTTP只能由HTTP客户端解释,而不能由人类(开发人员,最终用户等)来解释。

如有疑问,请不要问什么代码对您(人类)有意义。请问,什么代码对HTTP客户端有意义。您希望HTTP客户端的行为如何?

为什么?因为某些状态代码使这些客户端执行某些操作。例如302。此代码通常使Web浏览器重定向到响应标头中指定的特定位置(URI)。

这可能不是您的情况,但请务必注意。最终,HTTP状态代码被寻址到HTTP客户端。不适合我们的应用程序。不对人。


1:409很少被实现为导航错误。它通常涉及远程操作的执行(删除,更新,新建等)。但是URI应该存在。否则,将以404为准

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.