【http】http状态码

http状态码

相关文章

http状态码


一、常见状态码

1xx (信息性状态码): 表示请求已被接受或正在处理。

  • 100 Continue: 服务器已收到请求的初始部分,客户端应继续请求。

    场景: 客户端正在向服务器上传一个大文件。

    1
    2
    3
    4
    5
    6
    7
    POST /upload HTTP/1.1
    Host: example.com
    Content-Length: 1000000
    Expect: 100-continue
    Content-Type: application/octet-stream

    [large file data...]
    • 客户端通过 HTTP 发送一个 POST 请求,请求上传一个大文件到服务器。该请求包含 Expect 头部,告诉服务器在发送实际请求主体之前要进行 Expect 请求头的验证。

    • 服务器收到了客户端的请求,并检查了 Expect 头部。因为服务器需要先验证请求的有效性,所以它返回 100 Continue 状态码给客户端,表示请求的初始部分已被成功接收,客户端应该继续发送请求的其余部分。

    • 客户端收到 100 Continue 状态码后,继续发送剩余的请求主体数据。

    • 服务器接收到完整的请求后,开始验证请求、处理上传文件等操作。

  • 101 Switching Protocols: 请求者已要求服务器切换协议。

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

  • 200 OK: 请求成功。

  • 201 Created: 请求已经被实现,而且一个新的资源已经被创建。

    场景:当客户端提交一个表单来创建新用户账户时,服务器会创建一个新的用户账户,并返回状态码 201 Created,同时在响应的 Location 头部中包含新用户账户的 URI。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    const express = require('express');
    const app = express();
    const PORT = 3000;

    // 用于模拟存储用户数据的数组
    let users = [];

    // 解析请求体中的 JSON 数据
    app.use(express.json());

    // 创建新用户的路由处理程序
    app.post('/users', (req, res) => {
    // 从请求体中获取新用户的信息
    const newUser = req.body;

    // 为新用户生成唯一的 ID
    const userId = Math.floor(Math.random() * 1000000);

    // 为新用户添加 ID 属性
    newUser.id = userId;

    // 将新用户添加到用户数组中
    users.push(newUser);

    // 设置 Location 头部字段,指向新创建用户的 URI
    res.location(`/users/${userId}`);

    // 返回 201 Created 状态码,并返回新创建的用户信息
    res.status(201).json(newUser);
    });

    // 启动服务器
    app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
    });
  • 204 No Content: 服务器成功处理了请求,但没有返回任何内容。

    • 更新或删除操作成功: 当客户端发送一个请求,要求服务器更新或删除资源,并且服务器成功执行了该操作,但没有需要返回给客户端的额外信息时,服务器可能会返回 204 No Content 状态码。

    • 空的 POST 请求: 当客户端发送一个 POST 请求,但服务器在成功处理请求后不需要返回任何内容时,服务器可能会返回 204 No Content 状态码。

    • 预检请求(Preflight Request)成功: 在 CORS(跨域资源共享)中,当客户端发送一个预检请求(OPTIONS 请求)时,如果服务器成功处理了预检请求并返回了适当的响应,但在主请求中不需要返回任何内容时,服务器可能会返回 204 No Content 状态码。

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

  • 301 Moved Permanently: 资源已被永久移动到新位置。

    场景:

    • 网站重定向: 当网站管理员将某个页面的 URL 更改为新的 URL,并希望所有访问旧 URL 的用户被重定向到新的 URL 时,服务器会返回 301 Moved Permanently 状态码。这样,搜索引擎和用户的浏览器会记住这个重定向,将旧的 URL 映射到新的 URL 上。

    • 更改 URL 结构: 当网站进行重构或重新设计时,可能会更改网站的 URL 结构。如果旧的 URL 不再有效,服务器可以返回 301 状态码,将用户重定向到新的 URL 结构。

    • 更改域名: 当网站更改了主域名或者某些页面的域名时,服务器会返回 301 状态码,将旧的域名重定向到新的域名。

  • 302 Found: 资源临时被移动。

    场景:

    • 临时重定向: 当服务器希望临时将请求的资源重定向到另一个位置时,通常会使用 302 状态码。例如,当网站正在进行维护或暂时不可用时,服务器可能会将所有请求重定向到一个暂时的页面。
  • 304 Not Modified: 资源未被修改,可以直接使用缓存的版本。

    场景:

    • 客户端缓存有效: 当客户端向服务器请求资源时,它可能会在请求中包含一个条件 GET 请求头部,比如 If-Modified-Since 或 If-None-Match,用来告知服务器它上次获取资源的时间或标识。如果服务器发现客户端缓存的版本仍然有效,即资源在上次请求后没有发生改变,服务器就会返回 304 Not Modified 状态码,告知客户端可以继续使用缓存中的资源。

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

  • 400 Bad Request: 服务器无法理解请求的语法。

    场景:

    • 语法错误的请求: 请求的格式不符合 HTTP 规范,可能是由于缺少必需的头部信息、无效的请求方法、无效的请求 URI 等。
    1
    2
    3
    // 请求 URI 包含了空格字符
    GET /res?name=John Smith HTTP/1.1
    Host: example.com
    • 无效的参数或数据: 请求中包含了无效的参数、格式错误的数据、或者缺少必需的参数,导致服务器无法处理请求。

    • 安全性检查失败: 请求中包含了违反安全性策略的内容,比如包含恶意代码的请求、潜在的跨站脚本攻击等。

  • 401 Unauthorized: 请求要求身份验证。

    场景:

    • 缺少身份验证信息: 客户端发送的请求需要进行身份验证,但请求未包含有效的身份验证信息,如缺少 Authorization 头部。

    • 无效的身份验证凭据: 客户端提供的身份验证凭据无法通过验证,可能是因为提供的用户名或密码不正确,或者是因为凭据已失效。

    • 会话超时或失效: 如果服务器使用基于会话的身份验证机制,客户端的会话可能已超时或失效,导致需要重新进行身份验证。

    • 无权限访问资源: 即使客户端提供了有效的身份验证凭据,但它所请求的资源可能需要特定的权限或角色才能访问,而客户端没有相应的权限。

  • 403 Forbidden: 服务器拒绝请求。

    场景:

    • 权限不足: 客户端请求的资源需要特定的权限或角色才能访问,而客户端没有被授予相应的权限。

    • IP 地址受限: 服务器可能会根据客户端的 IP 地址限制对某些资源的访问,如果客户端的 IP 地址不在允许列表中,服务器可能会返回 403 Forbidden 状态码。

    • 资源被禁止访问: 服务器可能对某些资源进行了设置,不允许任何客户端访问,或者在特定条件下禁止访问。

    • 请求方法受限: 服务器可能会对某些请求方法进行限制,例如禁止对某些资源进行删除或修改操作,如果客户端发送了被禁止的请求方法,服务器可能会返回 403 Forbidden 状态码。

5xx (服务器错误状态码): 表示服务器在处理请求的过程中发生了错误。

  • 500 Internal Server Error: 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

    场景:

    • 服务器端代码错误: 服务器端的应用程序代码可能包含了错误,导致在处理请求时抛出了异常或发生了未捕获的错误。

    • 数据库错误: 当服务器端应用程序与数据库交互时,可能会发生数据库连接错误、查询错误或数据处理错误,导致服务器无法正常响应请求。

    • 内存或磁盘空间不足: 如果服务器的内存或磁盘空间不足,可能会影响服务器的正常运行,导致服务器无法完成请求。

    • 服务器配置错误: 服务器的配置可能存在问题,比如配置文件错误、权限设置错误等,导致服务器无法正常处理请求。

  • 503 Service Unavailable: 服务器暂时无法处理请求(例如,由于过载或维护)。

    场景:

    • 服务器维护: 当服务器需要进行维护或升级时,管理员可能会临时关闭服务器或关闭特定的服务,以确保维护操作可以顺利进行。在这种情况下,服务器会返回 503 状态码,告知客户端服务不可用。

    • 服务器超载: 当服务器处理过多的请求或流量超出服务器的处理能力时,服务器可能会暂时拒绝服务,以避免服务器崩溃或性能下降。在这种情况下,服务器会返回 503 状态码,告知客户端服务不可用。

    • 故障转移: 当服务器遇到故障或失败时,可能会触发故障转移或自动恢复机制,导致服务暂时不可用。在这种情况下,服务器会返回 503 状态码。

    • 负载均衡器故障: 如果网站使用负载均衡器来分发流量到多个服务器,如果负载均衡器遇到故障或配置错误,可能会导致服务不可用,并返回 503 状态码。

二、处理常见状态码的应用场景

404 Not Found:

当客户端请求的资源不存在时,服务器通常会返回 404 Not Found 状态码。在 Web 应用程序中,可以通过自定义 404 页面来提供友好的用户体验,告知用户所请求的页面或资源不存在。例如,可以创建一个专门的 404 页面,显示一个友好的错误消息,并提供导航链接或搜索框,帮助用户找到所需的内容。

401 Unauthorized:

当客户端请求的资源需要身份验证,但客户端提供的身份验证凭据无效或缺失时,服务器会返回 401 Unauthorized 状态码。在 Web 应用程序中,可以将用户重定向到登录页面,并要求用户提供有效的凭据。如果用户已经登录但没有足够的权限访问请求的资源,可以显示一个友好的错误页面,提示用户当前操作需要特定的权限或角色。

503 Service Unavailable:

当服务器无法处理请求或暂时不可用时,通常会返回 503 Service Unavailable 状态码。在这种情况下,可以通过设置合适的 Retry-After 头部来指示客户端何时可以重试请求。另外,可以为用户显示一个友好的维护页面,告知用户服务暂时不可用,并提供相关的联系方式或帮助文档。在某些情况下,还可以使用负载均衡器或故障转移机制来将流量重定向到备用服务器,以尽可能减少服务不可用时间。


喜欢这篇文章?打赏一下支持一下作者吧!
【http】http状态码
https://www.cccccl.com/20220504/http/http状态码/
作者
Jeffrey
发布于
2022年5月4日
许可协议