如果用户试图访问要求用户登录的页面,则返回正确的http状态代码似乎存在很多混淆.
那么基本上当我显示登录页面时会发送什么状态代码?
我很确定我们需要使用该4xx范围内的状态代码.
我不是在谈论HTTP身份验证,所以至少有一个我们不会使用的状态代码(401 Unauthorized).
现在我们应该使用什么?答案(也在SO上)似乎有所不同:
但在状态代码的描述中是:
授权无效,请求不应重复.
嗯,这看起来不是正确的.由于授权WOULD帮助.
所以让我们看看其他答案.这里的答案甚至根本不使用4xx范围而是使用302 Found
302 Found状态代码的描述:
请求的资源暂时驻留在不同的URI下.由于重定向有时可能会被更改,因此客户端应该继续使用Request-URI来处理将来的请求.如果由Cache-Control或Expires头字段指示,则此响应仅可缓存.
我认为这也不是我想要的.因为它不是位于不同URI下的请求资源.而是一个完全不同的资源(登录页面与经过身份验证的内容页面).
所以我走了另一个解决方案令人惊讶地选择了另一个答案.
这个答案建议我们选择400 Bad Request.
此状态代码的说明是:
由于语法格式错误,服务器无法理解请求.客户端不应该在没有修改的情况下重复请求.
我认为服务器理解请求很好,但在用户通过身份验证之前拒绝提供访问权限.
另一个答案也说403答案是正确的,但它的结尾是:
如果这是一个面向公众的网站,你试图根据会话cookie拒绝访问[这就是我所做的],200使用适当的主体来指示需要登录或者302临时重定向到登录页面通常最好.
所以403是正确的,但是200或者302是最好的.
嘿! 这就是我要找的:最好的解决方案.但最好不要和正确的一样吗?为什么它会是最好的?
感谢所有在这个问题上做到这一点的人:)
我知道我不应该太担心它.而且我认为这个问题更具假设性(不是真的,而是因为缺乏一个更好的词而使用它).
但这个问题现在困扰着我一段时间了.
如果我会成为一名经理(他们总是会听到一些很酷的发音),我会说:但是,但是,但是,但是,宁静很重要.:-)
那么:the right way™在上述情况下使用状态代码是什么(如果有的话)?
TL;博士
当用户尝试访问需要登录的页面时,正确的http状态代码响应是什么?
我有几个设计用AJAX调用的页面 - 如果它们无法显示,我会让它们返回异常状态代码,我的javascript会相应地显示错误框.
例如,如果用户未经过身份验证或其会话超时并且他们尝试调用其中一个AJAX页面,则会返回401 Unathorized.
500 Internal Server Error如果服务器端发生了奇怪的事情,我也有一些回报.
如果在没有必要参数的情况下调用其中一个页面,我应该返回什么状态代码?(因此不能返回任何内容).
我查看了有关HTTP状态代码的维基百科文章,但我能找到的最接近的代码是我正在寻找的代码:
422
不可处理的实体请求格式正确,但由于语义错误而无法遵循.
编辑:上面的代码是特定于WebDAV的,因此在这种情况下不太合适
谁能想到适当的代码才能返回?
Web应用程序的常见方案是在修改数据库的POST后重定向.就像在用户创建数据库对象后重定向到新创建的数据库对象一样.
似乎大多数Web应用程序使用302重定向,但如果您希望使用GET获取重定向中指定的URL,则303根据规范似乎是正确的做法.从技术上讲,使用302,浏览器应该使用与获取原始URL相同的方法获取指定的URL,这将是POST.大多数浏览器不会这样做.
302 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3
303 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
我应该使用302还是303?
我正在尝试创建一个具有2个依赖项的服务.其中一个依赖项是内部管理的,而第二个需要对第三方API进行外部http出站调用.该序列需要更新资源,然后执行http出站呼叫.
所以我的问题是,在第二步失败的情况下,返回正确的http状态代码是什么?
如果响应是424或500,并且消息正文解释了遇到的错误?
此处发布了一个类似的问题:REST API服务为验证失败返回的适当HTTP状态代码是什么?
上面的线程中的答案指出"例如,如果URI应该具有ISO-8601日期,并且您发现它的格式错误或者指的是2月31日,那么您将返回HTTP 400.如果您期望它同样如此实体主体中格式良好的XML,无法解析."
但是,如果用户提交了正确格式的数据,会发生什么?我的意思是,用户提交了用户名和密码的简单字母字符串/文本(这对我的应用程序完全有效).唯一的问题是密码与用户名不匹配.在这种情况下,400将是不正确的,因为它是完全有效的语法和格式良好.
一个401是不正确的(这里建议:哪个HTTP状态代码说用户名或密码不正确?)因为用户没有尝试访问任何页面,他只是尝试登录并输入不匹配的数据.
如果你回顾我链接的第一篇文章,第二个答案表明422是正确的响应(看起来对我来说是正确的),但是,我使用的是Django Rest Framework而422并不是状态代码的一部分(a可以在此处找到属于DRF的状态代码列表:http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx)
404也看起来不正确,因为数据被成功接受而不被拒绝.
话虽如此,应该使用的真正正确答案是什么?
validation rest restful-authentication http-status-codes django-rest-framework
我需要测试一些我编写的客户端应用程序代码,以测试它对来自Web服务器的HTTP响应中返回的各种状态代码的处理.
我安装了Fiddler 2(Web调试代理),我相信有一种方法可以使用这个应用程序修改响应,但我很难找到方法.这将是最方便的方式,因为它允许我保持客户端和服务器代码不被修改.
任何人都可以协助,因为我想拦截从服务器发送到客户端的HTTP响应并在到达客户端之前修改状态代码?
任何建议将不胜感激.
对于某些资源,我的REST风格的服务器只接受PUT和POST使用JSON对象请求作为内容主体,因此需要Content-Type的application/json,而不是application/x-www-form-urlencoded或multipart/form-data或其他任何东西.
格式错误的JSON(或缺少JSON)返回a,400其中包含直接从JSON解析器引发的异常中获取的错误消息,以进行调试.
哪个HTTP错误代码意味着客户端发送了一个不可接受的请求Content-Type,即使服务器可以在技术上解析请求内容?
我在Android平台上使用Google Volley.我遇到一个问题,其中error参数in onErrorResponse返回null networkResponse
对于我正在使用的RESTful API,我需要确定Http状态代码,它经常以401(SC_UNAUTHORIZED)或500(SC_INTERNAL_SERVER_ERROR)到达,我偶尔可以检查通过:
final int httpStatusCode = error.networkResponse.statusCode;
if(networkResponse == HttpStatus.SC_UNAUTHORIZED) {
// Http status code 401: Unauthorized.
}
Run Code Online (Sandbox Code Playgroud)
这会抛出一个NullPointerException因为networkResponsenull.
如何确定函数中的Http状态代码onErrorResponse?
或者,我如何确保error.networkResponse非空onErrorResponse?
当资源上无法进行DELETE(但不涉及用户权限)时,我的问题是关于HTTP状态代码的非常通用的问题.
我们在一种资源上有一个RESTful API.
该DELETE方法被授权的资源,但有些条件下的资源不能被删除下(如果有绑定到该资源数据).
在这种情况下,返回客户端的正确HTTP状态代码是什么?
以下是我收集的一些可能性以及为什么它在我的案例中似乎不合适:
更新:无法通过REST API更改阻止资源被删除的数据绑定.但是,资源可以通过其他方式"释放",因为数据所来自的数据库也可以被其他应用程序访问,这些应用程序可能会更改资源的状态(DB中的SQL DELETE总是可以这样做).
HTTP GET请求是否正常出现响应状态代码204 - No Content?就像,这对于HTTP GET应该完成的内容来说,这在语义上是否正确?我知道一个HTTP POST请求204 - No Content是可以的.对于GET请求,如果没有数据要发回,204状态代码是否合适?我应该使用404,还是仅仅坚持200以获得成功但是空洞的回答?
此问题的用例是我为Google App Engine编写的Java应用程序.我正在向servlet发送请求,但要发送回客户端的数据将通过Channel API套接字而不是HTTP Response传输.目前,我的客户端在请求正文中发送没有内容的POST,并在轮询Channel API套接字之前等待来自servlet的204响应.因为我没有在请求正文中发送数据,所以我在辩论发送GET而不是POST是否更有意义.
rest ×5
http ×4
android ×1
channel-api ×1
fiddler ×1
get ×1
http-request ×1
httpresponse ×1
mime-types ×1
validation ×1