本文从如下几个方面,按部就班走进 HTTP 状态码前端
HTTP 状态行中使用状态码(Status Code)和缘由短语(Reason Phrase)来简单描述请求的结果git
这里咱们重点介绍状态码,状态码是用以表示 HTTP 响应状态的 3 位数字代码,由RFC 2616规范定义。 合理的状态码不只可让用户或者浏览器作出更加合适的进一步操做(例如继续发送请求、切换协议,重定向跳转等),并且可让客户端代码更加易于理解和维护 。github
RFC 把状态码分红五类,分别是:web
1xx 是很陌生的,表明请求已被接受,须要继续处理。这类响应是临时响应,标示客户应该等待服务器采起进一步行动。面试
咱们最多见的是 101(Switching Protocols)算法
服务器已经理解了客户端的请求,并根据 Upgrade 消息头切换协议。浏览器
在 http header怎么判断协议是否是websocket 咱们提到过,http 发送请求给服务器,服务器经过判断 header 中是否包含 Connection: Upgrade
与 Upgrade: websocket
来判断当前协议是否要升级到 websocket ,若是服务器赞成进行 WebSocket 链接时,返回响应码 101
缓存
表示请求已成功被服务器接收、理解、并接受服务器
常见的有websocket
最多见的,表示请求成功
与 200 基本相同,但响应头后没有 body 数据
分片传输,每次只返回了请求资源的 部分 ,经常使用于实现断点续传或者将一个大文档分解为多个下载段同时下载
请求头中包含 Range
字段时,响应须要只返回 Range
指定的那一段。响应中应包含 Content-Range
来指示返回内容的范围
例如:
'Range':byte=5001-10000
// 表示本次要请求资源的5001-10000字节的部分
复制代码
这种状况下,若是服务器接受范围请求而且成功处理,就会返回 206
,而且在响应的头部返回
'Content-Range':bytes 5001-10000/10000
// 表示整个资源有10000字节,本次返回的范围为 5001-10000字节
复制代码
这类状态码表明须要客户端采起进一步的操做才能完成请求。一般,这些状态码用来重定向, 重定向目标在本次响应的 Location
头字段中指明
主要有如下 9 种状态码:
状态码 | 状态短语 | 状态含义 |
---|---|---|
300 | Multiple Choices | 当请求的 URL 对应有多个资源时(如同一个 HTML 的不一样语言的版本),返回这个代码时,能够返回一个可选列表,这样用户能够自行选择。经过 Location 头字段能够自定首选内容。 |
301 | Moved Permanetly | 当前请求的资源已被移除时使用,响应的 Location 头字段会提供资源如今的 URL。直接使用 GET 方法发起新情求。 |
302 | Found | 与 301 相似,但客户端只应该将 Location 返回的 URL 当作临时资源来使用,未来请求时,仍是用老的 URL。直接使用 GET 方法发起新情求。 |
303 | See Other | 用于在 PUT 或者 POST 请求以后进行重定向,这样在结果页就不会再次触发重定向了。 |
304 | Not Modified | 资源未修改,表示本地缓存仍然可用。 产生这个状态的前提是:客户端本地已经有缓存的版本,而且在 Request 中告诉了服务端,当服务端经过时间或者 Etag,发现没有更新的时候,就会返回一个不含 body 的 304 状态 |
305 | Use Proxy | 用来表示必须经过一个代理来访问资源,代理的位置有 Location 头字段给出 |
306 | Switch Proxy | 在最新版的规范中,306 状态码已经再也不被使用。最初是指“后续请求应使用指定的代理”。 |
307 | Temporary Redirect | 与 302 相似,可是使用原请求方法发起新情求。 |
308 | Permanent Redirect | 与 301 相似,可是使用原请求方法发起新情求。 |
这 9 种状态码能够分红 3 大类,分别是:永久重定向、临时重定向以及特殊重定向
301 和 308 都属于永久重定向,301 原本在规范中是不容许重定向时改变请求方法的(将POST改成GET),可是许多浏览器却容许重定向时改变请求方法(这是一种不规范的实现)
308 的出现也是给上面的行为作个规范,不过是不容许重定向时改变请求方法。
Permanent | Temporary | |
---|---|---|
Allows changing the request method from POST to GET. | 301 | 302 |
Does not allow changing the request method from POST to GET. | 308 | 307 |
30二、30三、307 都属于临时重定向,临时是指访问的资源可能暂时先用location的URI访问,但旧资源还在的,下次你再来访问的时候可能就不用重定向了
302 和 307 的关系相似于 301 和 308,303一般用来在建立、修改和删除时展现临时的进度页
除此以外,300/304/305/306 能够归属到特殊重定向类。这里重点说一下 304,304 是 HTTP 缓存中的一个重要内容,表示资源未修改,至关于将资源重定向到本地缓存。
304 又是一个每一个前端必知必会的状态,产生这个状态的前提是:客户端本地已经有缓存的版本,而且在 Request 中告诉了服务端,当服务端经过时间或者 Etag,发现没有更新的时候,就会返回一个不含 body 的 304 状态
表示客户端发送的请求报文有误,服务器没法处理,它就是真正的“错误码”含义了
因为明显的客户端错误(例如,格式错误的请求语法,太大的大小,无效的请求消息或欺骗性路由请求),服务器不能或不会处理该请求
表示服务器禁止访问资源。缘由可能多种多样,例如信息敏感、法律禁止等,若是服务器友好一点,能够在 body 里详细说明拒绝请求的缘由,不过现实中一般都是直接给一个“闭门羹”
请求失败,请求所但愿获得的资源未在服务器上发现,但容许用户的后续请求。
服务器错误,服务器在处理请求时内部发生了错误
通用错误消息,服务器遇到了一个不曾预料的情况,致使了它没法完成对请求的处理。没有给出具体错误信息。
服务器不支持当前请求所须要的某个功能。当服务器没法识别请求的方法,而且没法支持其对任何资源的请求
做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应
表示服务器当前很忙,暂时没法响应服务,咱们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码 503
打个生动的比方: