【从0开始学习计算机网络】| HTTP 状态码

前言:

刚写后端的时候,我每次看到浏览器控制台冒红就慌。后来发现,那些三位数字其实把问题范围给你框好了------知道它们的意思,排查方向基本就有了。

这篇写给刚开始接触后端开发的人,重点放在你以后会反复碰到的那些状态码上。

什么是 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。

相关推荐
2401_8734794014 分钟前
IPv6支持不足怎么办?用双栈兼容IP离线库实现平滑过渡
数据库·网络协议·tcp/ip·ip
小王C语言23 分钟前
虚拟机开机过程中关机,再次开机没有分配 IP
linux·网络·tcp/ip
鱼子星_25 分钟前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
脚踏实地皮皮晨28 分钟前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
零零信安38 分钟前
暗网监测技术实践(一):威胁源采集与反爬对抗——基于《暗网情报技术能力框架》的双生态视角
网络·数据泄露·零零信安
520拼好饭被践踏38 分钟前
JAVA+Agent学习day25
java·开发语言·学习
大黄说说40 分钟前
Java 并发大坑:volatile、synchronized、Lock 三者如何选择?
java·开发语言
魏码不凡1 小时前
CURL报错:未找到SSL证书文件问题
开发语言·php·ssl
翼龙云_cloud1 小时前
阿里云国际站代理商:ECS弹性伸缩 自动应对流量高峰
运维·网络·数据库·阿里云·架构
ZJH__GO1 小时前
网络编程v4--群聊和私聊的实现
运维·服务器·网络