HTTP状态码速查与场景解析
# HTTP状态码速查与场景解析
HTTP状态码也叫做HTTP响应状态码,用于表明特定的HTTP请求是否成功完成,客户端通过HTTP状态码就可得知请求的处理情况。
# HTTP状态码的分类
HTTP状态码有很多,可根据首位数字的不同来分为五大类,每类代表不同的响应状态:
- 1xx(信息响应):表明客户端的请求在目前为止一切正常,客户端可以继续请求,若已完成请求则忽略
- 2xx(成功响应):表明请求正常处理完毕
- 3xx(重定向消息):表示重定向,需要进一步的操作以完成请求。
- 4xx(客户端错误):表示客户端请求包含语法错误或无法完成。
- 5xx(服务器错误):表示服务器在处理请求时出现了错误
# 常用HTTP状态码
HTTP状态码目前的数量并不算少,要想全部记忆有些困难,一般来说记住几个常用的,其余碰到再查即可。
本文是根据RFC 2616规范来进行整理的状态码,自定义的状态码不在此列,望周知。
# 1xx(信息响应)
对于 1xx 大类下的状态码,有些单看定义和名称都有些抽象,理解起来有些困难,下面针对常用的状态码举例说明一下。
# 100 Continue
对于状态码 100 Continue,MDN 解释为:
这个临时响应表明,迄今为止的所有内容都是可行的,客户端应该继续请求,如果已经完成,则忽略它。
乍一看有些令人摸不着头脑,我们把它放到实际应用中会更直观一些,一般状态码 100 被应用在客户端准备发送大请求体(如大文件上传)的场景,此时客户端不确定服务器当前是否能处理数据,故先通过 100-continue协议 发送请求询问服务器,若服务器允许上传便返回 100 状态码,客户端便可以继续上传大请求体了。
如此再看MDN的解释就会清楚一些了,当服务端返回100时,客户端若有后续操作可继续请求,若没有则可忽略。用于允许客户端进行下一步操作,若没有不操作也无所谓。
补充说明:
碰到个关于状态码100不错的解释,在此补充一下。
100 (继续):请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
# 101 Switching Protocols
101 :该状态码是响应客户端的 Upgrade 请求头发送的,指明服务器即将切换的协议。
此状态码用于客户端需要切换协议时,通过 Upgrade 请求头指明想要切换的协议,若服务端也支持此协议,便会返回状态码101,表明服务器即将切换为客户端所指定的协议。
主要应用于建立 WebSocket 连接的场景中,它能允许已建立的连接升级到新的、不兼容的协议上。
# 2xx(成功响应)
2xx 大类下的状态码是平时最常碰见的一类响应状态码,也是编程的同学最喜欢见到的一类响应码,毕竟能看到 2xx 大类下的响应码,一般不会有太严重的错误,起码服务还能跑,那自己就不用跑路了,毕竟总得有个能跑的嘛(狗头)
在 2xx 大类下,最常用的就是状态码 200 了,其余的在实际应用中若没有特殊需求可都使用200作为请求成功的响应状态码。
# 200 OK
200:表示请求成功
嗯~ 嗯~ o( ̄▽ ̄)o,它真的就是表示请求成功。
# 3xx(重定向消息)
3xx 类别下的响应码用于表示需要执行额外的操作才能够完成请求,通常用于资源的临时或永久转移,需要客户端到新的地址上才能获取资源。
此类别下较为常用的状态码有:301(永久重定向)、302(临时重定向)、304(未修改)
# 301 Moved Permanently
301:表示永久重定向,原先的资源已被永久移动到新的位置,客户端的后续请求应该使用新地址
301(永久重定向)表示资源地址的永久变更,资源从一个地址变更为另一个地址,从当前当以后都需要从新的地址获取资源。
常见于网站域名更换的场景,当网站进行域名切换的时候,往往会使用301(永久重定向)进行地址的变更,若有做SEO的同学需注意,在切换域名的时候,一定要使用 301(永久重定向),这样才能让搜索引擎将原本页面的权重转移到新的页面上,不会影响自己的SEO。
# 302 Found
302:临时重定向,原先的资源被临时移动到新的位置,客户端的后续请求还可继续使用原地址,只是临时切换请求地址
302(临时重定向)虽然也是让客户端从新的地址请求资源,但是后续是可以继续使用原地址的,搜索引擎不会认为原地址失效了,所以是不会转移权重的,想要切换域名的同学要注意,不要用错响应状态码,会影响自己原本积累的权重和流量的。
302(临时重定向)通常用于页面的维护,可在页面的维护期间让访问原本的页面的请求跳转向提示页或替代页,优化用户的浏览体验,还可以用于临时改变页面的调用顺序,在原本的页面调用前添加临时的活动页或提示页,便于让用户都能了解到活动内容。
但无论如何使用302(临时重定向),在一定时间后都应切回原本的地址,这只是临时的地址切换而已。
# 304 Not Modified
304:资源未改变,客户端可直接使用本地缓存
遇到服务器响应304场景时,通常是所请求的资源没有发生变更,可直接使用客户端的本地缓存,一般是用于图片、CSS等静态资源,用于减少带宽消耗和服务器压力。
特别提一句,想要触发此响应需要先令客户端请求头包含 If-Modified-Since 或 If-None-Match,服务器验证资源是否变化后再返回。
If-Modified-Since 和 If-None-Match 都属于条件式请求首部,两者一同使用的时候,If-None-Match 优先级更高(需服务器支持)。
对 If-Modified-Since 来说服务器只在所请求的资源在给定的日期时间之后对内容进行过修改的情况下才会将资源返回,状态码为 200 。如果请求的资源从那时起未经修改,那么返回一个不带有消息主体的 304 响应。
对 If-None-Match 来说,当且仅当服务器上没有任何资源的 ETag 属性值与这个首部中列出的相匹配的时候,服务器端才会返回所请求的资源,响应码为 200 。否则服务器端将返回响应码 304。
# 4xx(客户端错误)
4xx 类别用于表示客户端错误,具体说来是此次请求由于客户端的问题而导致无法被服务器处理,通常是客户端发送请求的方法、负载或者格式有问题导致的。
客户端和服务器之间通过一套复杂的规定来表示在不同场景下的交互逻辑,双方交互要严格按照规定进行,若是双方不在一个频道上走,那就只能是对牛弹琴了。
常用的4xx状态码有:400(Bad Request)、401(Unauthorized)、403(Forbidden)、404(Not Found)、405(Method Not Allowed)
这个类别常见的状态码相对来说要多一些,平时或多或少总能碰到几个,下面详细介绍一下这几个状态码。
# 400 Bad Request
400:客户端请求语法、格式或参数错误。
客户端触发此响应的原因有些宽泛,一般来说,只要是服务端无法解析或者不认可的请求,都可以返回此状态响应码,客户端在收到此状态码后应检查请求,不应重复发送,当然了要是生气的话多点几下刷新是没问题的。
具体错误原因可能包括:
- 请求参数错误:如缺少必填参数、参数格式不正确等。
- 请求头错误:如不支持的Content-Type、无效的Accept头等。
- 请求体错误:如JSON格式错误、XML解析失败等。
具体原因只能是具体问题具体分析了,后续的客户端错误的响应状态码就比较细分化了。
# 401 Unauthorized
401:代表客户端错误,指的是由于缺乏目标资源要求的身份验证凭证,发送的请求未得到满足。
401(未授权)常见于需要登录或令牌验证的场景,如果客户端没有携带正确的凭证(例如 未登录、Token 过期、签名错误),就会被返回 401。
需要注意的是,401 并不是说明用户的权限不足,而是 未认证 或 认证失败。
例如:
- 用户在未登录直接访问需要登录的接口。
- 请求头中缺少或带错了 Authorization 信息。
- Token 已过期或无效。
通常服务端会在 401 响应中返回认证失败的原因,同时告知客户端如何进行身份认证。
# 403 Forbidden
403:代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。
403(禁止访问)与 401(未授权) 不同,403 表示客户端已认证(登录)成功,但没有足够的权限访问该资源。
通常出现于存在角色权限划分的项目中,当用户尝试操作不在自己权限范围内的资源时,服务器会响应此状态码。
# 404 Not Found
404:表示服务器无法找到所请求的资源
这算是最最最常碰到的响应码了,表示用户所请求的资源不存在,404(未找到)状态码的出现可能是因为URL地址拼写错误,或者所请求的资源和页面被删除或者移动了,但是网站管理员并没有通过302或301指明新的位置,由此会触发服务端响应404状态码。
# 405 Method Not Allowed
405:表明本次请求所指向的资源在服务器中禁止使用当前 HTTP 方法。
405(请求方法不允许)通常是因为所指向的资源不允许使用当前请求的方法去操作,例如在SpringBoot中,可通过注解指定API接口允许那种方法进行调用,若使用了不符合规定的调用方法,服务端则会响应405状态码。
# 500(服务器错误)
5xx类别下的状态码通常都代表着较为严重的问题,要么是服务器内部出现问题不能正常执行,要么就是服务器挂掉没办法正常响应,这个类别下的状态码算是后端同学最不想看到的状态码了,4xx还能推前端,这个锅可不好甩~
# 500 Internal Server Error
500:服务器内部错误,无法完成请求。
500(服务器内部错误) 是一个较为宽泛的 HTTP 状态码,表示服务器在处理请求时,应用程序内部发生了未能妥善处理的错误。由于异常未被捕获或正确处理,导致服务器无法完成当前请求,从而返回该错误码。
# 502 Bad Gateway
502:错误的网关,服务器作为网关或代理时,从上游服务器收到无效响应。
502(错误的网关)通常发生在服务器处于网关或反向代理角色时。客户端的请求并不会直接到达目标服务器,而是先经过网关层进行中转。若网关后方的服务器挂掉,无法从上游服务器获取响应,便会返回此状态码
# 504 Gateway Timeout
504:网关超时,服务器作为网关或代理时,没有在规定时间内等到上游服务器的响应。
504(网关超时) 同样出现在服务器充当网关或反向代理时。与 502(错误的网关) 不同,504 表示上游服务器本身是正常运行的,但由于处理请求耗时过长,超出了网关的等待时限,网关被迫终止等待并向客户端返回 504 响应。
# HTTP状态码概览
HTTP 状态码,此概览遵守 RFC 2616 规范,可根据大类速查。
# 1xx(信息响应)
状态码 | 名称 | 描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求。 |
101 | Switching Protocols | 切换协议。服务器根据客户端请求切换到其它协议(如 WebSocket)。 |
102 | Processing | 处理中。表示请求已接收,正在处理(WebDAV 扩展)。 |
103 | Early Hints | 早期提示。在最终响应前返回部分响应头,常用于提示浏览器预加载资源。 |
# 2xx(成功响应)
状态码 | 名称 | 描述 |
---|---|---|
200 | OK | 请求成功。返回所请求的资源或结果。 |
201 | Created | 请求成功并创建了新资源。 |
202 | Accepted | 请求已接收,但尚未处理完成。 |
203 | Non-Authoritative Information | 请求成功,但返回的响应信息可能来自第三方而非源服务器。 |
204 | No Content | 请求成功,但无返回内容。 |
205 | Reset Content | 请求成功,要求客户端重置文档视图(如表单清空)。 |
206 | Partial Content | 成功返回了部分资源(支持 Range 请求)。 |
207 | Multi-Status | 返回多个资源的状态(WebDAV 扩展,XML 格式)。 |
208 | Already Reported | 请求的成员已在之前的多状态响应中被列举(WebDAV 扩展)。 |
226 | IM Used | 服务器完成了请求,并返回了对当前资源应用实例操作的结果(HTTP Delta encoding 扩展)。 |
# 3xx(重定向消息)
状态码 | 名称 | 描述 |
---|---|---|
300 | Multiple Choices | 多种选择。客户端可选择多个可用资源。 |
301 | Moved Permanently | 永久重定向。资源已被永久移动到新的 URI。 |
302 | Found | 临时重定向。资源暂时移动到新的 URI。 |
303 | See Other | 使用 GET 方法获取资源的新 URI。 |
304 | Not Modified | 资源未修改,可使用缓存。 |
307 | Temporary Redirect | 临时重定向,请求方法不变。 |
308 | Permanent Redirect | 永久重定向,请求方法不变。 |
# 4xx(客户端错误)
状态码 | 名称 | 描述 |
---|---|---|
400 | Bad Request | 错误请求。语法错误或无效请求。 |
401 | Unauthorized | 未授权。请求需要身份验证。 |
402 | Payment Required | 需要付款。(保留,几乎未使用) |
403 | Forbidden | 禁止访问。服务器拒绝请求。 |
404 | Not Found | 未找到。服务器无法找到请求的资源。 |
405 | Method Not Allowed | 请求方法不被允许。 |
406 | Not Acceptable | 无法根据客户端请求的内容特性返回响应。 |
407 | Proxy Authentication Required | 需要代理身份验证。 |
408 | Request Timeout | 请求超时。客户端未在规定时间内完成请求。 |
409 | Conflict | 请求与当前资源状态冲突。 |
410 | Gone | 资源已被永久删除。 |
411 | Length Required | 缺少 Content-Length 头,服务器拒绝请求。 |
412 | Precondition Failed | 请求条件未满足。 |
413 | Payload Too Large | 请求体过大,服务器无法处理。 |
414 | URI Too Long | 请求的 URI 过长,服务器无法处理。 |
415 | Unsupported Media Type | 请求格式或媒体类型不受支持。 |
416 | Range Not Satisfiable | 请求范围无效。 |
417 | Expectation Failed | 服务器无法满足 Expect 请求头字段要求。 |
418 | I'm a teapot | 我是茶壶。(愚人节笑话状态码,RFC 2324) |
421 | Misdirected Request | 请求被发送到错误的服务器。 |
422 | Unprocessable Entity | 请求格式正确,但语义错误(WebDAV)。 |
423 | Locked | 资源已锁定(WebDAV)。 |
424 | Failed Dependency | 因依赖请求失败而失败(WebDAV)。 |
425 | Too Early | 服务器不愿冒险处理可能被重放的请求。 |
426 | Upgrade Required | 客户端应切换到其他协议(如 HTTPS)。 |
428 | Precondition Required | 要求请求包含条件。 |
429 | Too Many Requests | 请求过多,触发速率限制。 |
431 | Request Header Fields Too Large | 请求头字段过大,服务器拒绝处理。 |
451 | Unavailable For Legal Reasons | 因法律原因不可用。 |
# 5xx(服务器错误)
状态码 | 名称 | 描述 |
---|---|---|
500 | Internal Server Error | 服务器内部错误,未捕获的异常或配置错误。 |
501 | Not Implemented | 服务器不支持所请求的功能。 |
502 | Bad Gateway | 网关或代理从上游服务器收到无效响应。 |
503 | Service Unavailable | 服务不可用,通常因过载或维护。 |
504 | Gateway Timeout | 网关未能及时收到上游服务器的响应。 |
505 | HTTP Version Not Supported | 请求使用的 HTTP 版本不受支持。 |
506 | Variant Also Negotiates | 服务器配置错误,导致内容协商循环。 |
507 | Insufficient Storage | 服务器存储空间不足(WebDAV)。 |
508 | Loop Detected | 检测到循环请求(WebDAV)。 |
510 | Not Extended | 服务器需要进一步扩展请求。 |
511 | Network Authentication Required | 需要进行网络身份验证(如 Wi-Fi 登录认证)。 |
# 附录
在整理和总结HTTP状态码时,碰到了两个有趣的网站,分享一下,看这个可比纯粹看HTTP 状态码好看多了。
文章标题:女生说话像 HTTP 状态码的正确方式
文章内将各个HTTP状态码对应为女生会说的话,生动形象,看完只能说奇怪的知识又增加了,细想之下合情合理,就是看完有点不能直视 HTTP 状态码了,哈哈~
文章地址:https://blog.wolfyang.fan/posts/girl-talk-like-http-status-code-guide
文章来自博客小狼阳帆
,博客主页:https://wolfyang.fan
网站:HTTP Cats
为每个HTTP 状态码都配上了各种猫咪图片,各种形式的图片都有,有些图片相当奔放。其还贴心的准备了能够获取的图片直链地址,点击状态码还可看到对对应状态码的概述和MDN的跳转链接,有点不太好的是,不支持中文,所以最近自己想着要不复刻一个中文版,换上自己喜欢的图片应该也很有趣。
网站地址:https://http.cat/
此网站是在Github中的开源项目,有需要的同学可以自行 Fork 研究,觉得有趣也别忘了点个 star,支持下这些有趣的项目。