你有没有遇到过这种情况?网页刷不出来,显示"404";请求失败,显示"500";点个链接页面突然跳转到别的地址了......
这些数字到底是啥?服务器想告诉你什么?
今天,我用收快递的故事,来讲讲HTTP状态码那些事儿。
原文地址
状态码是干嘛的?
你网购之后,快递小哥会怎么跟你反馈?
- 「您好,您的快递到了」------送成功了
- 「抱歉,这个地址查无此人」------找不到人
- 「不好意思,快递网点着火了」------出问题了
HTTP状态码,就是服务器在给你「反馈」的方式。
它不是一个随意的数字,而是一个三位的密码。第一位代表「类别」,后面两位代表「具体情况」。
| 第一位 | 含义 | 像快递说什么 |
|---|---|---|
1xx |
收到请求,正在处理 | 「收到了,稍等」 |
2xx |
搞定了 | 「给您送到了」 |
3xx |
去找别人 | 「这个地方不归我管,你去找别的网点」 |
4xx |
你的问题 | 「地址写错了,不是我能送的」 |
5xx |
我的问题 | 「网点出问题了,送不了」 |
来,我们一个个说。
1xx:收到了,稍等
1xx这个区间,属于「过渡状态」------服务器收到请求了,正在处理,你等着就行。
100 Continue
「您好,我要寄这个快递。」
「好,我先看看单子。」
这就是100 Continue。客户端发送了一个请求,服务器说:「收到了,你继续发。」
一般用于大文件上传------客户端先问一句「能收吗」,服务器说「能」,客户端再开始传。
101 Switching Protocols
「您好,我能换成到付吗?」
「可以,给您改一下。」
101就是这样的场景------服务器同意切换协议,比如从HTTP升级到WebSocket。
2xx:搞定了
「送到了」就是2xx系列的主题。
200 OK
最常见的成功状态码。
快递小哥说:「您好,您的快递放驿站了。」
但注意!200 OK不代表内容一定是你想要的,只代表请求成功了。具体对不对,要看响应body。
201 Created
「您好,我再寄一个。」
「好嘞,单子给您开好了。」
201表示请求成功了,而且服务器创建了新的资源。常见于POST、PUT请求,比如你提交了一个表单。
204 No Content
「您好,帮我把驿站里的快递签收一下。」
「好嘞,已经签收了。」然后就没有然后了。
204的意思是:请求成功了,但没有内容返回给你。 常见于DELETE操作,或者「已读回执」这种不需要返回数据的场景。
206 Partial Content
「您好,我只要这个包裹里的其中一件,另外几件不要了。」
「好嘞,给您拆出来。」
206就是「部分内容」------常见于断点续传,或者下载一个大文件的时候只下载其中一部分。
3xx:去找别人
3xx系列的意思是:「这个件不归我管,你去找别的网点。」
301 Moved Permanently
「您好,我要寄到A地址。」
「不好意思,A地址的网点永久搬走了,以后直接寄到B地址吧,别来这儿了。」
301是永久重定向------服务器告诉你,这个地址永久搬家了,以后访问直接去新地址。
SEO影响:301会传递SEO权重,搜索引擎会更新收录。
302 Found / 307 Temporary Redirect
「您好,我要寄到A地址。」
「今天A网点临时不接单,您先去B网点凑合一下,明天再来A。」
302和307是临时重定向------服务器告诉你,这次去另一个地址,但以后还来这里。
区别 :302可能会被滥用为「临时」但实际永久的情况,所以后来出了307专门表示「临时」且方法不变。
304 Not Modified
「您好,我上次寄存在你这儿的东西还在吗?」
「在呢,跟之前一样,没动过,您直接拿走吧。」
304是我们上一篇文章讲过的------缓存命中。服务器告诉浏览器:「你要的东西没变,直接用缓存。」
这是最「省钱」的状态码------不用重新传输内容,节省带宽。
4xx:你的问题
4xx开头的错误,是客户端的「锅」。服务器说:「这不是我的问题,是你地址写错了。」
400 Bad Request
「您好,我要寄一棵树,但是要种在月球上。」
「抱歉,您这要求我做不到。」
400就是服务器看不懂你的请求------参数错误、格式不对、JSON写错了,都可能返回400。
401 Unauthorized
「您好,我要取件。」
「抱歉,您没带身份证,不能取。」
401是未授权------你需要提供身份凭证,比如登录、 Token。
403 Forbidden
「您好,我有身份证,让我进去取件。」
「不好意思,我们店不接待你。」
403是禁止访问------服务器知道你是谁,但就是不让你进。和401的区别是:401是「没带证」,403是「带证也不让你进」。
404 Not Found
「您好,我要取件,单号是XXX。」
「抱歉,查无此件。」
这是最著名的状态码------你要的东西不存在。
但注意!404不一定是真的「没了」,有时候是权限问题不想让你看到,也会返回404(故意装成不存在)。
405 Method Not Allowed
「您好,我要用快递柜寄件。」
「抱歉,这个快递柜只能收件,不能寄件。」
405是请求方法不对------比如接口只支持GET,你用POST去请求,就会返回405。
408 Request Timeout
「您好,我要寄件......」
......(沉默五分钟)
「您还寄吗?不寄我关门了。」
408是请求超时------客户端发请求的时候,服务器等太久没等到。
409 Conflict
「您好,我要同时寄一个东西到A地址和B地址,但是不能一样。」
「抱歉,这做不到,我们只能寄一个地方。」
409是冲突------常见于并发修改,比如两个人同时改同一个快递单,第二个提交的人就会收到409。
413 Payload Too Large
「您好,我要寄一艘航母。」
「对不起,您这太大了,我们运不了。」
413是请求体太大------上传文件超过限制了。
429 Too Many Requests
「您好,我要寄件。」
「好。」
「我要寄件。」
「好。」
「我要寄件。」
「......您别寄了,今天已经被您包圆了,明天再来吧。」
429就是请求太多了------接口有 rate limit,超过次数就返回这个。
5xx:我的问题
5xx开头的错误,是服务器自己「翻车」了。
500 Internal Server Error
「您好,我的快递呢?」
「不好意思,我们的网点着火了,快递全烧了,今天送不了。」
500是最常见的服务器错误------具体原因未知,反正是服务器挂了。
502 Bad Gateway
「您好,我的快递呢?」
「是这样的,今天我们用的是隔壁网点的仓库,但隔壁网点关门了。」
502是网关错误------服务器作为网关或代理,去请求上游服务器,结果上游返回了错误。
503 Service Unavailable
「您好,我的快递呢?」
「不好意思,我们网点今天休息,暂时不接单,过俩小时再来吧。」
503是服务暂时不可用------一般是服务器在维护或者过载,过一会儿可能就好了。
常见于「服务正在启动中」「高峰期限流」等场景。
504 Gateway Timeout
「您好,我的快递呢?」
「仓库说在找呢......五分钟过去了......还在找呢......」
「到底能不能送?」
504是网关超时------服务器作为网关,等上游服务器响应,等太久没等到。
总结:状态码速查表
| 类别 | 含义 | 常见状态码 |
|---|---|---|
1xx |
收到了,稍等 | 100, 101 |
2xx |
搞定了 | 200, 201, 204, 206 |
3xx |
去找别人 | 301, 302, 304, 307 |
4xx |
你的问题 | 400, 401, 403, 404, 405, 429 |
5xx |
我的问题 | 500, 502, 503, 504 |
写在最后
现在你应该懂了:HTTP状态码就是服务器在跟你「对话」。
- 200不代表真的「完全OK」,可能只是「收到了」
- 404不代表网站「挂了」,可能是「不想让你看」
- 500不代表彻底没救,可能是「暂时忙」
下次遇到这些状态码,别慌,先看看是几开头------问题出在谁身上,一目了然。