HTTP状态码

一、HTTP 状态码(必背基础题)

1.1 状态码是什么?

服务器收到你的请求后,除了返回你要的数据,还会返回一个三位数的”回应码”,告诉你这次请求的结果怎么样。

通俗比喻:你去餐厅点菜,服务员(服务器)给你上菜时会附一张小纸条:

 
200 = "您的菜来了,请慢用"           → 成功
 
301 = "这道菜搬到隔壁分店了"          → 永久重定向
 
404 = "菜单上没这道菜"               → 找不到
 
500 = "厨房着火了"                   → 服务器内部错误
 

1.2 五大类速记

类别范围一句话通俗比喻
1xx100~199信息性,“收到了,继续”服务员说”您的单子我接了,稍等”
2xx200~299成功菜端上来了
3xx300~399重定向,“去别的地方找""这道菜搬到新地址了”
4xx400~499客户端错误,“你搞错了""你点了一道不存在的菜”
5xx500~599服务器错误,“我搞砸了""厨房出问题了”

记忆口诀:1 继续、2 成功、3 搬家、4 你的锅、5 我的锅。

状态码决策树


flowchart TD

    A["收到 HTTP 响应"] --> B{状态码范围?}

    B -->|1xx| C["信息性:继续"]

    B -->|2xx| D["✅ 成功"]

    B -->|3xx| E{"重定向类型?"}

    B -->|4xx| F{"客户端错误"}

    B -->|5xx| G{"服务器错误"}

    E -->|301| E1["永久重定向<br/>浏览器缓存新地址"]

    E -->|302| E2["临时重定向<br/>不缓存"]

    E -->|304| E3["内容未变<br/>用缓存"]

    F -->|401| F1["未认证 → 去登录"]

    F -->|403| F2["无权限 → 登录也没用"]

    F -->|404| F3["资源不存在"]

    F -->|429| F4["限流 → 慢点发"]

    G -->|500| G1["代码 bug"]

    G -->|502| G2["上游服务挂了"]

    G -->|503| G3["过载/维护"]

    G -->|504| G4["上游超时"]


1.3 每类必须记住的状态码

2xx 成功

状态码含义通俗解释
200 OK请求成功菜端上来了,吃吧
201 Created资源创建成功你新注册了一个账号,注册成功
204 No Content成功但没有返回体你删了一条记录,成功了,但没啥好返回的
 
# FastAPI 中返回不同状态码的示例
 
from fastapi import FastAPI, status       # 导入 FastAPI 和状态码常量
 
app = FastAPI()                            # 创建应用实例
 
@app.post("/users", status_code=201)       # 创建用户,返回 201 Created
 
def create_user(name: str):
 
    return {"name": name}                  # 返回创建的用户信息
 
@app.delete("/users/{id}", status_code=204)  # 删除用户,返回 204 No Content
 
def delete_user(id: int):
 
    pass                                   # 删除成功,不返回任何内容
 

3xx 重定向

状态码含义通俗解释
301 Moved Permanently永久搬家那家店永久搬到新地址了,以后直接去新的
302 Found临时搬家那家店今天装修,临时换个地方,明天还回原址
304 Not Modified内容没变,用缓存你问”菜单变了吗?“,服务员说”没变,看上次那份就行”

301 vs 302 的关键区别

  • 301:浏览器会记住新地址,下次直接去新的(缓存重定向)
  • 302:浏览器不记,每次还先去旧地址问一下

304 的生活场景:你每天早上问楼下保安”今天小区有新通知吗?“。保安说”没有,昨天的通知还有效”——你就不需要重新抄一遍,用昨天的笔记就行。这就是缓存,304 就是”没变,用你手头的”。

 
# 304 在 FastAPI 中的体现(ETag / If-None-Match)
 
from fastapi import FastAPI, Request, Response   # 导入必要模块
 
app = FastAPI()                                   # 创建应用实例
 
@app.get("/data")                                 # 定义 GET 接口
 
async def get_data(request: Request):
 
    current_etag = "abc123"                       # 当前资源的版本标识(哈希值)
 
    client_etag = request.headers.get("if-none-match")  # 客户端上次拿到的版本标识
 
    if client_etag == current_etag:               # 如果客户端的版本和服务器一样
 
        return Response(status_code=304)          # 返回 304:没变,用你缓存的
 
    return {"data": "some content"}               # 有变化,返回新数据
 

4xx 客户端错误

状态码含义通俗解释
400 Bad Request请求格式有误你填的表单有问题,服务器看不懂
401 Unauthorized未认证(没登录)你没带门票,进不去
403 Forbidden已认证但没权限你有门票但这是 VIP 区,你等级不够
404 Not Found资源不存在你要找的页面/资源不存在
405 Method Not Allowed方法不允许这个接口只接受 GET,你用了 POST
409 Conflict冲突你要注册的用户名已经被别人用了
429 Too Many Requests请求太频繁你 1 秒发了 100 次请求,服务器说你慢点

401 vs 403 重点掌握

  • 401 = 你没证明你是谁(没带身份证)→ 去登录
  • 403 = 你证明了你是谁,但你没权限干这事(你有身份证但不是管理员)→ 登录也没用

生活场景

 
你去公司大楼:
 
前台:"请出示工牌"  →  你没工牌  →  401 Unauthorized(先去办工牌)
 
前台:验了工牌,你确实是员工
 
但你要进"CEO 办公室"  →  你不是 CEO  →  403 Forbidden(你是谁不重要,你没权限)
 

5xx 服务器错误

状态码含义通俗解释
500 Internal Server Error服务器内部错误厨房炸了,不知道啥原因
502 Bad Gateway网关/上游服务挂了前台接了你的单,但后厨没响应
503 Service Unavailable服务暂时不可用餐厅今天歇业,明天再来
504 Gateway Timeout网关超时前台等后厨等太久,放弃了

500 vs 502 vs 503 vs 504

  • 500:代码 bug,服务器自己崩了
  • 502:服务器作为中间人,后面的上游服务挂了(比如 Nginx 反代的后端崩了)
  • 503:服务暂时过载或维护中(通常可重试)
  • 504:服务器作为中间人,等上游服务等超时了

生活场景——餐厅打比方

 
500  →  厨师炒菜时着火了(服务器代码 bug)
 
502  →  你点了外卖,骑手说"餐厅关门了"(上游服务挂了)
 
503  →  餐厅门口挂着"今日盘点,暂停营业"(过载/维护)
 
504  →  你点了菜,等了 30 分钟还没上,你走了(超时)
 

速记卡(面试闪卡)

Q1:一句话讲清「HTTP状态码」到底是什么?

A:HTTP 状态码是服务器返回的三位数回应码,用五大类告诉你请求结果是成功、重定向还是出错。

Q2:五大类速记:1继续 2成功 3搬家 4你的锅 5我的锅 —— 怎么理解?

A:像餐厅小纸条:1xx 服务员说收到了、2xx 菜上来了、3xx 搬到新地址、4xx 你点错菜、5xx 厨房着火(Status Code Class)。

Q3:常见 2xx/3xx:200/201/301/304 —— 怎么理解?

A:像上菜的不同结果:200 成功、201 创建成功、301 永久搬家(浏览器记住)、304 没变用缓存(Not Modified)。

Q4:常见 4xx:401 没认证 403 没权限 404 找不到 —— 怎么理解?

A:像进公司大楼:401 没工牌先去办、403 有工牌但不是 CEO 进不去、404 要找的页面不存在(Client Error)。

Q5:常见 5xx:500 崩了 502 上游挂 503 歇业 504 超时 —— 怎么理解?

A:像后厨出状况:500 代码 bug、502 上游服务挂、503 过载维护、504 等上游等太久(Server Error)。

Q6:核心速记主线有哪些?

  • 五大类:1继续 2成功 3重定向 4客户端错 5服务端错

  • 2xx:200 成功 / 201 创建 / 204 无返回体

  • 3xx:301 永久(缓存) / 302 临时 / 304 用缓存

  • 4xx vs 5xx:401 未认证、403 无权限、404 不存在;500/502/503/504 服务端

口诀

A:状态码三位数,一继二成三搬家

四你五我错分家,二〇一成二〇四

三零一永久三零四,四零一证四零三

五零零崩五零二挂,五零三五零四压

相关链接