前言:
刚写后端的时候,我每次看到浏览器控制台冒红就慌。后来发现,那些三位数字其实把问题范围给你框好了------知道它们的意思,排查方向基本就有了。
这篇写给刚开始接触后端开发的人,重点放在你以后会反复碰到的那些状态码上。
什么是 HTTP 状态码?
状态码是服务器在每次响应里都会带上的三位数字,比如最常见的 200 OK。
第一位数字决定了大方向:
| 类别 | 含义 |
|---|
|-----|------|
| 1xx | 信息响应 |
|-----|----|
| 2xx | 成功 |
|-----|-----|
| 3xx | 重定向 |
|-----|-------|
| 4xx | 客户端错误 |
|-----|-------|
| 5xx | 服务器错误 |
一句话记:2 成 3 跳 4 你错 5 我炸。
1xx:信息响应(了解即可)
1xx 基本见不到,知道有这回事就行。100 是服务器说"继续发",常见于上传大文件时;101 是协议切换,比如 HTTP 升到 WebSocket。日常开发几乎不碰。
2xx:请求成功了
200 OK ------ 没啥好说的,你每天都看到的那个。请求拿到数据了。
201 Created ------ POST 创建资源成功的时候返回。注册账号、新建订单这些场景。实际开发里很多人图省事统一用 200,严格来说这是偷懒,但确实很普遍。
204 No Content ------ 操作成功但没东西返回。删一个用户,删完了也没啥好告诉你的,就 204。
3xx:重定向,面试爱考
核心逻辑:你的请求没问题,但得去别的地方找。
301 vs 302,这是面试高频。
**301 是永久搬家。**比如老域名迁到新域名,HTTP 升级到 HTTPS。浏览器会记住这个跳转,下次直接去新地址。搜索引擎也会把老页面的权重传过去,所以网站迁移都用 301。
**302 是临时出去一下。**最常见的就是你没登录,访问 /profile,服务器把你 302 到 /login,登录完再回来。浏览器不缓存这个跳转,SEO 权重也不传。
区别一句话:301 是"以后都去那儿",302 是"这次先去那儿"。
304 Not Modified ------ 服务器告诉浏览器"文件没变,用你本地的缓存"。**减少带宽,加快加载。**你刷网页的时候 F12 打开 Network 面板,一堆 304。
4xx:请求有问题
这组状态码的核心:问题出在客户端这边。但别被"客户端"三个字骗了------后端的代码写错了也会导致 4xx(比如接口文档写 A 参数,前端传 A,但后端实际读的是 B)。
400 Bad Request ------ 请求参数格式不对。JSON 少个括号、字段类型对不上,后端解析直接炸。排查方向:看请求 body 是不是合法的。
401 vs 403,另一个面试高频。
很多人搞混。简单说:
▎ 401 = 服务器不知道你是谁(没登录、没 Token)
▎ 403 = 服务器知道你是谁,但你不配
你带着过期 Token 访问 /user/info → 401。Spring Security 没收到 Authorization 头 → 401。
你用普通用户身份试图删除管理员 → 403。权限框架(Shiro、Spring Security)的 hasRole 校验不通过 → 403。
排查思路:401 看登录态(Token、Cookie、Session),403 看 RBAC 权限配置。
404 Not Found ------ 资源不存在。URL 拼错了、ID 不存在、Controller 路径没对上。注意:有些后端会故意对无权限的资源也返回 404,避免暴露资源存在性。
5xx:服务器崩了
这组的核心:请求本身没问题,服务器内部炸了。
500 Internal Server Error ------ 最熟悉的陌生人。代码抛了没 catch 的异常,容器(Tomcat)不知道该怎么处理,就统一返回 500。
在生产环境见过最多的 500:
空指针------查了个不存在的用户,然后直接 .getName(),当场 NullPointerException
数据库挂了或 SQL 写错了------表不存在、字段名拼错、连接池满了
死循环或 OOM------请求处理到一半内存炸了
排查就是看日志。找第一条异常堆栈,别盯着最后一行看------Caused by 链的根才是真因。
500 vs 502,第三个面试高频。
前提是你用了 Nginx 或网关:
用户 → Nginx/网关 → Spring Boot
-
500:Nginx 成功把请求转发到了后端,后端处理过程中自己抛了异常。Spring Boot 说"我炸了"。
-
502:Nginx 根本连不上后端。Spring Boot 没启动、端口改了什么、或者响应超时被 Nginx 掐了。Nginx 说"我找不到你的服务"。
排查 502:先看服务起没起(ps 或 docker ps),再看端口对不对,再看超时配置。八成是服务挂了。
排查思路(实际上手版)
出问题了 → 打开浏览器 F12 → Network 面板
│
4xx → 检查请求参数、Token、URL、权限配置
│
5xx → 连上服务器看日志,别猜原因
│
502 → 看网关能不能通后端(curl 一下就知道)
-
404 → 对一下 URL 和 Controller 路径
-
401 → Token 带了没、过期没
-
403 → 权限注解写对没(@PreAuthorize)
-
500 → tail -f 看日志,复现一次
-
502 → curl localhost:8080 看是不是服务没了
几个实际经验
状态码的定义是标准,但实际开发里不按标准来的情况到处都是。见过不少团队所有错误都返回 200,然后在 response body 里自己定义 code 字段。这做法很多人不喜欢,但它确实存在。
还有,状态码和业务错误不是一回事。用户余额不足返回 400 还是 200+自定义 code?两种做法都有,重要的是团队统一,别让前端同学对着状态码猜来猜去。
作为后端开发,你真正需要熟练掌握的就那么十几个:200、201、204、301、302、304、400、401、403、404、500、502。