HTTP状态码400与412的区别

33

我正在开发一个REST API。

如果进行POST以创建资源时缺少必需字段,应该返回什么?

400 - 错误请求

还是

412 - 先决条件失败

为什么?


1
这个回答解决了你的问题吗?什么情况下应该使用HTTP 412错误进行响应? - Michael Freidgeim
3个回答

41

如果请求的参数错误,则使用400。如果请求中的某个If-* 头部(例如If-MatchIf-Modified-Since等)错误,则使用412。

为什么?这就是RFC规范要求的。例如,参见此处关于If-Match规范的摘录:

如果没有任何实体标签匹配,或者给定了“*”,但当前没有实体存在,则服务器不得执行请求的方法,并必须返回412(先决条件失败)响应。当客户端希望防止更新方法(如PUT)修改自上次检索以来已更改的资源时,此行为最有用。


1
它还指出,由于400的语法错误,请求无法被满足。 - Rob
1
这个页面真的帮了我很多 - http://odino.org/don-t-rape-http-if-none-match-the-412-http-status-code/ - 使用“PUT”请求来解释上下文让我更容易理解它的用途,因为滥用某些状态码总是很容易的。 - Charlie

17

当服务器不符合客户端指定的条件时,使用412错误码。

在本例中,应该使用400错误码,表示请求无效。

关于前置条件标头的解释,请参考此链接

Etag标头通常是表示HTTP标头中我们资源的字符串。如果您使用If-Match来请求资源,则这是一个预先条件的HTTP标头。如果不匹配您发送的代码,则会返回412错误码。

If-None-Match告诉服务器仅在与客户端发送的Etag不同的情况下处理整个响应。


4
有人今天过得不太好。只需要忽略它,让系统自行运作 :) - BalusC

5
您可以使用状态码422。如果不想使用,400也可以接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接