如果请求缺less必需的参数,应该使用什么HTTP状态响应代码?

我在想412(先决条件失败),但是可能会有更好的标准?

状态422似乎最基于规范适用 。

422(不可处理的实体)状态码意味着服务器理解请求实体的内容types(因此415(不支持的媒体types)状态码是不合适的),并且请求实体的语法是正确的(因此400(错误的请求)状态码不合适),但无法处理包含的说明。 例如,如果XML请求主体包含格式正确(即,语法正确),但语义错误的XML指令,则可能出现此错误情况。

他们指出,格式错误的XML是一个糟糕的语法(呼吁400)的例子。 格式错误的查询string似乎与此类似,所以400似乎不适合缺less参数的格式正确的查询string。

更新 @DavidV正确地指出,这个规范是为WebDAV,而不是核心HTTP。 但是一些stream行的非WebDAV API无论如何都使用了422,因为缺less一个更好的状态代码( 见这个 )。

我不确定是否有一套标准,但我会使用400 Bad Request

由于格式错误,服务器无法理解请求。 客户端不应该不加修改地重复请求。

.NET中的WCF API通过在使用webHttpBinding时返回HTTP 404 “Endpoint Not Found”错误来处理缺less的参数。

如果您将Web服务方法名称与其参数签名一起考虑,那么404 Not Found可能是有意义的。 也就是说,如果你公开一个Web服务方法LoginUser(string, string)并且你请求了LoginUser(string) ,那么找不到后者。

基本上这意味着您所调用的Web服务方法以及您指定的参数签名无法find。

10.4.5 404未find

服务器没有find任何匹配的请求的URI。 没有迹象表明病情是暂时的还是永久性的。

正如Gert所build议的那样 , 400 Bad Request仍然是一个有效的响应代码,但我认为它通常用于指示较低级别的问题。 这可能很容易被解释为一个格式错误的HTTP请求,可能是缺less或无效的HTTP标头,或类似的。

10.4.1 400错误的请求

由于格式错误,服务器无法理解请求。 客户端不应该不加修改地重复请求。

您可以发送400个错误的请求代码。 它是更通用的4xx状态码之一,因此您可以使用它来表示您的意图:客户端发送的请求缺less应用程序需要的信息/参数才能正确处理。

在我们的一个API项目中,我们决定为某个请求设置一个409状态,当我们因为缺less参数而无法以100%填满时。

HTTP状态代码“409 Conflict”对我们来说是一个很好的尝试,因为它的定义需要包含足够的信息以供用户识别冲突的来源。

参考: w3.org/Protocols/

因此,在400或404等其他响应中,我们select了409来强制在请求中查找一些注释,这有助于设置新的正确请求。

无论如何,我们的情况是特别的,因为如果请求不完全正确,我们需要发送一些数据前夕,我们需要强制客户端查看消息并理解请求中的错误。

一般来说,如果我们只有一些缺less的参数,我们去400和一个缺less参数的数组。 但是当我们需要发送更多的信息,比如特定的情况下,我们希望更确定的客户将照顾它,我们发送一个409

我经常使用403 Forbidden错误。 理由是这个请求被理解了,但是我不会按照要求去做(因为事情是错误的)。 响应实体解释了什么是错误的,所以如果响应是HTML页面,则错误消息在页面中。 如果是JSON或XML响应,那么错误信息就在那里。

从rfc2616 :

10.4.4 403禁止

服务器了解请求,但拒绝履行。
授权不起作用,请求不应重复。
如果请求方法不是HEAD并且服务器想要创build
公众为什么要求没有得到履行,它应该描述在实体拒绝的原因。 如果服务器不希望将这个信息提供给客户端,则状态码404
(未find)可以用来代替。

可以认为应该使用404 Not Found因为404 Not Found指定的资源。

对于那些有兴趣的人来说,Spring MVC(至less3.x)返回400,这在我看来是错误的。

我testing了几个Googleurl(accounts.google.com)并删除了所需的参数,在这种情况下他们通常会返回一个404。

我会复制谷歌。

我通常去422(不可处理的实体),如果在所需的参数的东西不符合API端点要求(如一个太短的密码),但一个缺less的参数我会去406(不可接受)。

我会去403。

从RFC 2616 – 超文本传输​​协议 – HTTP / 1.1

403禁止

服务器了解请求,但拒绝履行。 授权不起作用,请求不应重复。 如果请求方法不是HEAD,服务器希望公开为什么请求没有被满足,那么它应该描述拒绝的原因。 如果服务器不希望将这些信息提供给客户端,则可以使用状态码404(Not Found)。

你应该在你的回答中描述失败的原因。 如果你不想这样做,只需使用404。