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

时间:2010-06-16 03:19:38

标签: http http-status-codes

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

11 个答案:

答案 0 :(得分:321)

状态422似乎最适合基于spec

  

422(不可处理实体)状态代码表示服务器       了解请求实体的内容类型(因此a       415(不支持的媒体类型)状态代码不合适),和       请求实体的语法是正确的(因此是400(错误请求)       状态代码不合适但是无法处理包含的内容       说明。例如,如果是XML,则可能会出现此错误情况       请求正文包含格式正确(即语法正确),但是       语义错误的XML指令。

他们声称格式错误的xml是一个错误语法的例子(调用400)。格式错误的查询字符串似乎与此类似,因此400似乎不适合缺少参数的格式良好的查询字符串。

更新 @DavidV正确地指出此规范适用于WebDAV,而非核心HTTP。但是,由于缺少更好的状态代码(see this),一些流行的非WebDAV API无论如何都在使用422。

答案 1 :(得分:161)

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

  

请求无法理解   由于语法错误导致的服务器。   客户端不应该重复   请求不加修改。

答案 2 :(得分:28)

.NET中的WCF API通过在使用webHttpBinding时返回HTTP 404“端点未找到”错误来处理缺少的参数。

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

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

  

10.4.5 404 Not Found

     

服务器未找到与Request-URI匹配的任何内容。没有   指示该条件是暂时的还是   永久的。

400 Bad RequestGert suggested仍为有效的响应代码,但我认为它通常用于表示较低级别的问题。它可以很容易地被解释为格式错误的HTTP请求,可能缺少或无效的HTTP标头,或类似的。

  

10.4.1 400错误请求

     

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

答案 3 :(得分:7)

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

答案 4 :(得分:7)

我通常会选择422(不可处理的实体),如果所需参数中的某些内容与API端点所需的内容不匹配(如密码太短),但对于缺少的参数,我会选择406(不可接受)。

答案 5 :(得分:7)

在我们的一个API项目中,我们决定将409状态设置为某个请求,因为缺少参数,我们无法将其完全填充为100%。

  

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

参考:w3.org/Protocols/

因此,在400或404之类的其他响应中,我们选择409强制要求查看请求中的某些注释,这有助于设置新的正确请求。

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

一般情况下,如果我们只有一些缺失参数,我们会选择 400 和一个缺少参数的数组。但是当我们需要发送更多信息时,比如特定的案例信息,我们希望更加确定客户会照顾它,我们发送一个409

答案 6 :(得分:4)

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

来自rfc2616

  

10.4.4 403禁止

     

服务器理解请求,但拒绝履行请求   授权无效,请求不应重复   如果请求方法不是HEAD并且服务器希望制作
  公开为什么请求没有得到满足,它应该描述   实体拒绝的原因。如果服务器不希望   将此信息提供给客户,状态代码404
  (未找到)可以代替使用。

答案 7 :(得分:3)

可以认为应该使用404 Not Found,因为无法找到指定的资源。

答案 8 :(得分:2)

对于那些感兴趣的人,Spring MVC(至少3.x)在这种情况下返回400,这对我来说似乎不对。

我测试了几个Google网址(accounts.google.com)并删除了所需的参数,在这种情况下,它们通常会返回404.

我会复制谷歌。

答案 9 :(得分:0)

返回404 -这意味着找不到资源。

尝试编辑包含ID的网站的网址。我尝试了一些:

  • gitub回购问题
  • 汇合页面
  • amazon产品视图
  • 易趣列表
  • bbc新闻文章

所有人都返回404,因为这些开发人员正在正确解释标准,而这里的答案以及其他很多答案都没有!

答案 10 :(得分:-3)

我会选择403。

来自RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

  

403禁止

     

服务器理解请求,但拒绝履行请求。授权无效,请求不应重复。如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)。

您应该在回复中描述失败的原因。如果您不想这样做,请使用404。

相关问题