Answers:
根据规范,状态422最合适。
422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码不合适),并且请求实体的语法正确(因此400(错误请求) )状态代码不合适),但无法处理其中的说明。例如,如果XML请求主体包含格式正确(即,语法正确)但语义错误的XML指令,则可能发生此错误情况。
他们指出,格式错误的xml是语法错误的示例(要求400)。格式错误的查询字符串似乎与此相似,因此400似乎不适用于缺少参数的格式正确的查询字符串。
UPDATE @DavidV正确地指出此规范适用于WebDAV,而不适用于核心HTTP。但是,由于缺少更好的状态代码,一些流行的非WebDAV API仍在使用422(请参阅参考资料)。
400
比较合适。
我不确定是否有设定的标准,但是我会使用400 Bad Request,最新的HTTP规范(来自2014年)记录如下:
6.5.1。400错误的要求400(错误请求)状态代码表示服务器由于某些原因(例如格式错误的请求语法,无效的请求消息框架或欺骗性的请求路由)而被视为客户端错误,因此服务器无法处理该请求。
400 Bad Request
表示协议级别的问题,而不是语义错误。如果我们要劫持HTTP状态代码以指示应用程序级别(而不是协议级别)的错误,为什么不一直使用并直接使用412
?
使用webHttpBinding时,.NET中的WCF API通过返回HTTP 404
“找不到端点”错误来处理丢失的参数。
404 Not Found
如果您将Web服务方法名称及其参数签名一起考虑,则可能很有意义。也就是说,如果您公开Web服务方法LoginUser(string, string)
并请求LoginUser(string)
,则不会找到后者。
基本上,这意味着找不到正在调用的Web服务方法以及您指定的参数签名。
10.4.5找不到404
服务器未找到与请求URI匹配的任何内容。没有迹象表明这种情况是暂时的还是永久的。
的400 Bad Request
,因为格特建议,仍然是一个有效的响应代码,但我认为这是通常用于指示下级的问题。很容易将其解释为格式错误的HTTP请求,可能缺少或无效的HTTP标头或类似的内容。
10.4.1 400错误的请求
由于语法格式错误,服务器无法理解该请求。客户不应在没有修改的情况下重复请求。
在我们的一个API项目中,我们决定为某些请求设置409状态,因为由于缺少参数而无法以100%的比例完全填充它。
HTTP状态代码“ 409冲突”对我们来说是一个很好的尝试,因为它的定义要求包括足够的信息,以便用户识别冲突的根源。
因此,在其他响应(例如400或404)中,我们选择409来强制要求查看请求中的一些注释,这有助于建立新的正确请求。
无论如何,我们的情况都是特别的,因为如果请求不完全正确,我们需要发送一些数据前夕,并且我们需要强制客户端查看消息并了解请求中的错误。
通常,如果我们只有一些缺失的参数,我们可以选择400和缺失参数的数组。但是,当我们需要发送更多信息(例如特殊情况的消息)并且希望确保客户会妥善处理时,我们发送409
如果所需参数中的某些内容与API端点所需的内容不匹配(例如密码太短),我通常会选择422(无法处理的实体),但是对于缺少的参数,我会选择406(无法接受)。
Accept-Language: de
表示将仅接受德语响应,但服务器可用的被请求文档的唯一版本是英语或法语。)使用它来指示请求中缺少参数是不正确的,根据规范中的定义。
对于那些感兴趣的人,在这种情况下,Spring MVC(至少3.x)返回400。
我测试了多个Google网址(accounts.google.com),并删除了必需的参数,在这种情况下,它们通常返回404。
我会复制Google。
可能会争辩说404 Not Found
应该使用a,因为找不到指定的资源。
我经常使用403禁止错误。原因是请求已被理解,但我不会按照要求执行(因为事情有误)。响应实体说明了问题所在,因此,如果响应是HTML页面,则错误消息在该页面中。如果是JSON或XML响应,则其中包含错误信息。
从rfc2616:
10.4.4 403禁止
服务器理解了该请求,但拒绝执行该请求。
授权将无济于事,并且不应重复该请求。
如果请求方法不是HEAD,并且服务器希望
公开为什么未满足请求,则应在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则
可以改用状态代码404 (未找到)。
Authorization will not help
,因此Twitter不应将其发送给无效的OAuth凭据。
仅使用ASP.NET Core作为参考或示例,ASP.NET Core即可为您提供带有操作的控制器,这就是“ Details”操作的外观。
// GET: Cars/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null)
{
return NotFound();
}
var car = await _context.Cars.FirstOrDefaultAsync(m => m.CarId == id);
if (car == null)
{
return NotFound();
}
return View(car);
}
如果id
未设置参数,则返回404 Not Found。
返回404-表示找不到资源。
尝试编辑包含ID的网站的网址。我尝试了一些:
所有人都返回404,imo,因为这些开发人员正确地解释了标准,而这里的答案以及其他很多答案都没有!
requestBody
。
我会选择403。
从RFC 2616-超文本传输协议-HTTP / 1.1
403禁止
服务器理解了该请求,但拒绝执行该请求。授权将无济于事,并且不应重复该请求。如果请求方法不是HEAD,并且服务器希望公开为什么未满足请求,则应在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以改用状态代码404(未找到)。
您应在回复中说明失败的原因。如果您不想这样做,请使用404。