大家好,我是前端西瓜哥。今天我们来学习 HTTP 中的常用状态码及使用场景。
作为前端,经常需要从后端获取数据,所以对 HTTP 的掌握也是很重要的。
其中 HTTP 状态码则代表了当前请求的状态,比如客户端还是服务端错误之类的,也是考的比较多的点。
1xx 消息
这类状态码,代表请求已被服务端接受,但服务端还要继续进行处理。
100 Continue
继续。
服务端收到请求,并表示可以继续。在客户端准备推送较大的数据时,可以用 100 表示允许。
101 Switching Protocols
切换协议。
比较常见的是响应 WebSockets 连接,浏览器会先发送 HTTP 请求,在请求头里带上希望升级为 WebSockets 协议的相关信息。
服务端收到后,如果支持 WebSockets,就会返回这个状态码 101,进行 HTTP 到 WebSockets 的协议切换。
2xx 成功
这类状态码代表服务已被正常处理。
200 OK
成功。
200 是用得最多的状态码,前端请求接口,数据正常返回,就会拿到这个状态码。这是大家最喜欢看到的状态码。
3xx 重定向
代表客户端需要进行进一步操作才能完成请求。
301 Moved Permanently
永久重定向。
请求的资源被永久移动到其他位置。
假如我们的一篇博客的 url 地址发生了永久的改变,但用户收藏夹里的链接还是旧的,我们就可以在用户请求旧链接时,返回 301 状态码,并赋上一个重定向地址。
HTTP/1.1 301 Moved PermanentlyLocation: http://www.example.org/index.asp
这样用户就能跳到正确的新地址中。
这新的重定向地址会被浏览器缓存,下次用户访问旧链接时,就不会发请求拿到 301,而是直接就跳到重定向地址了。
所以设置重定向地址时要小心点,别搞错了。
还有一个常用用途是 HTTP 链接跳转到 HTTPS 链接。
比如我们访问 http://zhihu.com/,就会跳转到 https://www.zhihu.com/。
302 Found
临时重定向。
原始描述短语为 Moved Temporarily。
适合一些临时的重定向操作,比如因为服务器崩溃导致一些页面无法提供正确的访问,在修复期间,则可以通过 302 先暂时地重定向到一个新的地址。修复完后再让用户继续访问原链接。
302 不会持久缓存,但可以设置缓存时间持续一段时间。
HTTP/1.1 302 FoundLocation: https://www-temp.example.org/Cache-control: private; max-age=600
304 Not Modified
没有改变。
304 指的是资源相比上次没有发生变化,客户端可以继续使用之前缓存的资源,以减轻浏览器负担。
这里涉及到了 HTTP 缓存中的强缓存和协商缓存知识。协商缓存中会用到 304 状态码。
具体可以看我之前写的一篇文章:《HTTP 缓存策略:强缓存和协商缓存》
4xx 客户端错误
客户端的问题。
400 Bad Request
不好的请求。
通用的客户端错误,表示问题是出在客户端身上的。比如传的参数不对。
在前端和后端对接接口时,比较常看到这个错误,因为容易写错参数名,或者后端新增或修改了参数。
404 Not Found
不存在。
广为人知的状态码,代表 url 对应资源不存在。
比如一些文章被删除,是直接在数据库中进行不可逆地彻底删除的。然后就导致用户访问这个页面时,服务器找不到对应数据,然后就返回一个 404,并提示 “页面不存在”。
405 Method Not Allowed
方法不被允许。
请求方法没用对,比如一个请求应该用 POST,你却用了 GET 请求,就会得到 405。
拿到 405 通常说明你的 url 没错,错的是方法。如果 url 也不对,你拿到的将是 404。
5xx服务器错误
服务端的问题,快去找后端,别老抓着前端一顿问。
500 Internal Server Error
内部服务错误。
后端服务器的代码出了 bug,比如读取了一个 null 的属性,就会导致服务无法正常运行下去,然后后端就会捕获(catch)这个错误,返回 500,告知是后端服务器出了问题。
严重的情况下,后端服务直接崩溃。
502 Bad Gateway
网关错误。
比如后端服务崩溃,但中间的一些代理服务器 Web Server(比如 Ngnix)还能正确运行。但因为无法访问到后端服务,所以就会返回一个 502。
504 Gateway Timout
网关超时。
网关还在,但后端服务因为各种原因(比如因为一个死循环卡死了),导致一直没有响应回来,在过了一段时间后网关了依旧没能收到消息,就会给客户端返回 504 网关超时。
结尾
常见的 HTTP 状态码大概就是这些。