数字背后的故事:深入理解HTTP状态码

419 阅读11分钟

状态码的分类

1xx(信息性状态码) - 表示请求已被接收,继续处理。

2xx(成功状态码) - 表示请求已成功被服务器接收、理解和处理。

3xx(重定向状态码) - 客户端需要采取进一步操作才能完成请求。

4xx(客户端错误状态码) - 请求包含语法错误或无法完成。

5xx(服务器错误状态码) - 服务器遇到错误,无法完成合法的请求。

1开头

  • 100 Continue
  • 101 Switching Protocols

100 Continue 含义: 服务器已收到客户端的请求头,并且客户端可以继续发送请求体(通常是用于分块传输的场景)。 用途: 这个状态码通常出现在客户端需要发送大量数据(如文件上传)到服务器时。客户端会先发送一个请求头,询问服务器是否愿意接收请求体。 如果服务器返回 100 Continue,表示服务器已经准备好接收请求体,客户端可以继续发送数据。 典型场景: 文件上传:客户端在发送大文件之前,先发送一个带有 Expect: 100-continue 的请求头,等待服务器确认后再发送文件内容。 避免浪费带宽:如果服务器拒绝请求(例如认证失败),则无需传输整个请求体,从而节省资源。

101 Switching Protocols 含义: 服务器同意客户端的协议切换请求,并将通信协议切换到新的协议。 用途: 这个状态码通常用于客户端和服务器之间协商协议升级。例如,从 HTTP 协议升级到 WebSocket 协议。客户端通过在请求头中发送 Upgrade 字段来请求协议切换,服务器如果同意,则返回 101 Switching Protocols并执行协议切换。 典型场景: WebSocket 协议升级: 客户端发起一个 HTTP 请求,请求头包含 Connection: Upgrade和 Upgrade: websocket,服务器同意后返回 101,并开始使用 WebSocket 协议进行双向通信。 - 其他协议升级:比如从 HTTP/1.1 切换到 HTTP/2。

2开头

2xx(成功状态码) 是一组表示请求已被成功接收、理解和处理的状态码。它们通常表明客户端的请求是有效的,服务器已经完成了相应的操作。

200 OK 含义: 请求成功。服务器已按照客户端请求的内容返回了响应。 用途: 这是最常见的成功状态码,用于表示一切正常。 对于 GET 请求,通常会返回请求的资源;对于 POST 请求,通常会返回操作结果。 典型场景: 浏览网页时加载成功。 提交表单后,服务器返回成功消息。

201 Created 含义: 请求成功并且服务器创建了新的资源。 用途: 通常用于 POST 请求,表示客户端提交的数据已经被服务器接受并存储为新资源。 响应中通常会包含一个 Location 头,指向新创建资源的 URL。 典型场景: 用户注册:提交用户信息后,服务器创建了一个新用户账户。 文件上传:上传文件后,服务器保存了文件并返回其访问地址。

202 Accepted 含义: 请求已被接受,但尚未处理完成。 用途: 表示服务器已经收到了请求,但实际处理可能需要一些时间(例如后台任务)。 不保证请求最终一定会成功,只是表明服务器正在处理。 典型场景: 异步任务:如提交批量数据处理请求,服务器返回 202 并在后台处理。 长时间运行的任务:如启动虚拟机、生成报表等。

204 No Content 含义: 请求成功,但响应中没有内容返回。 用途: 表示服务器成功处理了请求,但不需要返回任何数据。 常用于 DELETE 请求或更新操作,表明操作成功但无需额外信息。 典型场景: 删除资源:客户端请求删除某个文件或记录,服务器成功删除后返回 204。 更新配置:客户端修改了某些设置,服务器成功应用后返回 204。

206 Partial Content 含义: 服务器成功处理了部分 GET 请求。 用途: 通常用于支持断点续传或分块下载。 客户端通过 Range 请求头指定需要获取的部分资源,服务器只返回这部分内容。 典型场景: 视频流媒体:客户端请求视频的一部分内容进行播放。 文件下载:大文件下载中断后,客户端请求未下载的部分继续下载。

3开头

3(重定向状态码)** 是一组表示客户端需要采取进一步操作才能完成请求的状态码。这些状态码通常用于告诉客户端,资源的位置已经发生了变化,或者需要通过其他方式来完成请求。

301 Moved Permanently

含义: 请求的资源已被永久移动到新的位置。

用途: 表示资源的 URL 已经更改,并且以后所有对该资源的请求都应该使用新的 URL。 搜索引擎会更新索引,指向新的 URL。 典型场景:

网站迁移:例如从 example.com 迁移到 https://example.co… 页面重命名:用户访问旧页面时被重定向到新页面。 响应头: 服务器通常会在响应头中包含 Location 字段,指向新的资源地址。

image.png

302 Found (Temporary Redirect) 含义: 请求的资源临时位于不同的 URI 下。 用途: 表示资源暂时被移动到了另一个位置,但客户端以后的请求仍然应该使用原来的 URL。 与 301 不同的是,302 是临时性的,搜索引擎不会更新索引。 典型场景: 用户登录后重定向到首页或个人中心。 A/B 测试:将用户随机分配到不同的页面版本。 响应头: 同样会包含 Location 字段,指向临时的新地址。

image.png

303 See Other 含义: 响应可以通过另一个 URI 获取,客户端应使用 GET 方法请求新资源。 用途: 通常用于 POST 请求后的重定向,告诉客户端用 GET 方法去获取结果。 避免重复提交表单数据。 典型场景: 提交表单后,服务器返回 303 并重定向到结果页面。 响应头: 包含 Location 字段,指向新的资源地址。

image.png

304 Not Modified 含义: 资源未被修改,客户端可以使用缓存的版本。 用途: 用于条件请求(如带有 If-Modified-Since 或 If-None-Match 头的请求)。 如果资源没有变化,服务器返回 304,避免重新传输数据。 典型场景: 浏览器缓存:客户端请求一个资源,如果资源没有更新,则直接使用本地缓存。 响应头: 不包含响应体,只返回状态码和必要的头部信息。

image.png

307 Temporary Redirect 含义: 临时重定向,与 302 类似,但明确要求客户端保持原始请求方法不变。 用途: 确保客户端在重定向时不会改变请求方法(如 POST 不会变成 GET)。 典型场景: API 调用中,临时将请求路由到另一个服务器。 响应头: 包含 Location 字段,指向新的资源地址。

image.png

308 Permanent Redirect 含义: 永久重定向,与 301 类似,但明确要求客户端保持原始请求方法不变。 用途: 适用于需要永久性更改资源位置的场景,同时确保请求方法不被改变。 典型场景: 网站迁移时,确保 POST 请求不会被错误地转换为 GET。 响应头: 包含 Location 字段,指向新的资源地址。

image.png

4开头

客户端错误状态码) 是一组表示客户端请求存在问题的状态码。这些状态码表明客户端的请求包含语法错误、权限不足或资源无法找到等问题,导致服务器无法完成请求。

400 Bad Request 含义: 客户端发送的请求有语法错误或无法被服务器理解。 用途: 表示请求参数不合法、格式错误或缺少必要字段。 通常用于 API 请求中,当客户端提交的数据不符合要求时返回此状态码。 典型场景: 提交表单时缺少必填字段。 JSON 格式错误,例如缺少引号或括号不匹配。 参数类型错误,例如将数字传为字符串。

image.png

401 Unauthorized 含义: 请求需要身份验证,但客户端未提供有效的认证信息。 用途: 表示用户未登录或提供的认证凭据无效。 常用于保护受限制的资源,提示客户端需要重新登录或提供正确的认证信息。 典型场景: 用户访问需要登录的页面,但未登录。 API 调用时未提供有效的 Token 或用户名密码。

image.png

403 Forbidden 含义: 服务器理解请求,但拒绝执行,通常是由于权限不足。 用途: 表示用户已通过身份验证,但没有足够的权限访问资源。 与 401 不同的是,403 表示即使提供正确的认证信息,也无法访问。 典型场景: 普通用户尝试访问管理员专属页面。 文件系统中,用户没有读取或写入某个文件的权限。

image.png

404 Not Found 含义: 请求的资源在服务器上不存在。 用途: 表示客户端请求的 URL 对应的资源无法找到。 常用于处理无效链接或已被删除的资源。 典型场景: 用户输入了错误的 URL。 访问的文章或页面已被删除。 API 中请求的资源 ID 不存在。

image.png

429 Too Many Requests 含义: 客户端在给定时间内发送了过多的请求,触发了服务器的速率限制。 用途: 用于防止滥用或过载,保护服务器资源。 通常会附带一个 Retry-After 头,告诉客户端何时可以再次尝试。 典型场景: 用户频繁刷新页面或提交表单。 API 调用超出允许的频率限制。

image.png

5开头的状态码

(服务器错误状态码) 是一组表示服务器在处理客户端请求时遇到问题的状态码。这些状态码表明问题是出在服务器端,而不是客户端的请求有问题。

500 Internal Server Error 含义: 服务器遇到了未知的错误,无法完成请求。 用途: 表示服务器内部发生了未预料到的问题,导致无法正常处理请求。 这是一个通用的错误状态码,通常用于捕捉所有未明确分类的服务器错误。 典型场景: 代码中存在未捕获的异常。 数据库连接失败。 文件系统不可用。

image.png

501 Not Implemented 含义: 服务器不支持或未实现请求的功能。 用途: 表示客户端请求的方法或功能在服务器上不可用。 通常用于告知客户端该功能尚未开发或不受支持。 典型场景: 客户端使用了 HTTP 方法(如 PUT 或 DELETE),但服务器未实现对这些方法的支持。 请求的 API 功能尚未开发完成。

image.png

502 Bad Gateway 含义: 服务器作为网关或代理时,从上游服务器接收到无效的响应。 用途: 表示服务器在充当网关或代理时,未能从后端服务器获取有效的响应。 通常发生在反向代理或负载均衡器环境中。 典型场景: 后端服务崩溃或返回了无效的响应。 网关与后端服务之间的通信中断。

image.png

503 Service Unavailable 含义: 服务器暂时无法处理请求,通常是由于过载或维护。 用途: 表示服务器当前不可用,但可能是暂时的。 通常会附带一个 Retry-After 头,告诉客户端何时可以再次尝试。 典型场景: 服务器正在进行维护。 服务器资源耗尽(如 CPU 或内存不足)。 高流量导致服务不可用。

image.png

总结

在前端开发中最容易遇到404,400 一个是路径错误,一个是参数不合法。需要好好看看协议文档。