第2章 HTTP状态码详解:常见的HTTP错误码及含义
调试接口的时候,最怕什么?
我最怕那种“啥都不返回,只给你一个状态码”的情况。你明明代码写得挺顺,一跑就炸了。其实啊,HTTP状态码就是服务端给你的一个“暗号”。读懂它,你就能猜出那边发生了什么。
2.1 状态码的骨架:5大类
HTTP状态码分5类,每一类代表一个大的方向。我当你面试新人时,会先问这个框架:
| 范围 | 类别 | 代表意思 |
|---|---|---|
| 1xx | 信息 | 请求已接收,继续处理 |
| 2xx | 成功 | 请求被正常处理 |
| 3xx | 重定向 | 需要进一步操作才能完成 |
| 4xx | 客户端错误 | 你发的东西有问题 |
| 5xx | 服务器错误 | 服务端自己炸了 |
说白了,你拿到的状态码落在哪个区间,就大概知道毛病出在哪一端。记住这个,抓包时第一眼就能锁定方向。
2.2 2xx 系列:一切正常
- 200 OK:最常规的成功。请求完成,响应体里有你想要的。我以前写爬虫的时候,看到200就开心,结果正文是个空JSON……唉,状态码只是第一步。
- 201 Created:通常用在POST创建资源后。比如注册用户,返回201表示新用户已落地。
- 204 No Content:成功,但没内容。常用于DELETE操作。我在项目中见过有人对着204干等响应体,这没必要。
我的习惯:抓包时先看状态码,如果落在2xx,再读响应体;如果落在4xx/5xx,先别读体——先看响应头里的错误描述更关键。
2.3 3xx 系列:你走错路了,跟我来
重定向码其实是个“追赶者”。常见的有:
- 301 Moved Permanently:资源永久搬迁。浏览器会记住新地址。我调试过一次CDN缓存,发现某些客户端还拿着旧地址,就是301没处理到位。
- 302 Found(也叫307 Temporary Redirect):临时跳转。下次还来原来的。
- 304 Not Modified:告诉客户端“你用缓存吧,我没变”。静态资源优化经常靠它。注意,304没有响应体——你查包时别怀疑自己抓漏了。
避坑提醒:我以前用Fetch API时,redirect: 'manual'忘了设置,导致自动跟了302,日志里完全看不到跳转记录。抓包时要留意请求链是否有301/302。
2.4 4xx 系列:是你搞错了
这应该是最常见的调试对象了。我工作中遇到的大部分线上问题都出在这一档。
2.4.1 400 Bad Request
客户端请求格式不对。可能是JSON语法错误、参数缺失、Content-Type设置错。我碰到过几次:明明是POST请求,Body却写成了Query String,然后返回400。
2.4.2 401 Unauthorized & 403 Forbidden
- 401:没认证。没带或者凭证过期。抓包时记得看请求头里
Authorization字段。 - 403:认证了,但没权限。比如普通用户访问管理员接口。两种码容易搞混,其实看4xx的
WWW-Authenticate头能更清楚。
2.4.3 404 Not Found
最著名的一个。路径不对。我调试微服务网关时经常遇到:服务名拼错、路由表没更新,统统返回404。注意,有些服务为了保护接口信息,会把真正的404伪装成401或403,抓包时要结合URL分析。
2.4.4 405 Method Not Allowed
你用了错误的HTTP方法。GET接口却发POST。我见过菜鸟用链接发POST请求,结果直接405。
2.4.5 408 Request Timeout
请求超时。客户端发得太慢,或者网络延迟太高。抓包时可以检查请求的耗时——提前设了timeout吗?
2.4.6 422 Unprocessable Entity
RESTful的常用码。格式对了,但语义不对。比如邮箱字段填的不是邮箱格式。这比400更细致。
2.4.7 429 Too Many Requests
限流了。我接手的一个线上告警,QPS高峰时客户端疯狂重试,最后全被429弹回来。记住,看到429要降频,别硬冲。
2.5 5xx 系列:服务端自己的锅
5xx说明服务端内部出了问题。我最头疼的就是这个——因为有时候我们自己看不到完整的栈。
- 500 Internal Server Error:通用错误。服务端抛异常了,但没具体说明。
- 502 Bad Gateway:网关拿到上游的无效响应。Nginx、API Gateway上常见。常在代理层查错。
- 503 Service Unavailable:服务暂时过载或维护中。抓包时看响应头
Retry-After,可以知道多久后重试。 - 504 Gateway Timeout:上游响应超时。比如后端处理太慢,Nginx在60秒没等到结果就返回504。我曾经在数据库慢查询场景下频繁遇到。
关键认知:4xx和5xx的根本区别——4xx是客户端的错,改自己的代码;5xx是服务端的错,得让后端同事查日志。别搞混了。
2.6 一张图看懂状态码分类
2.7 抓包时看状态码的实用技巧
- 先看大类:别记全,记住"2成功、3重定向、4我的问题、5服务端问题"就够了。
- 留意响应头:有时候服务端会把错误详情塞在
X-Error-Code或Retry-After里,比码本身更有用。 - 区分Proxy vs Origin:如果经过Nginx/网关,502/504通常来自代理层,500/503多来自后端服务。抓包时看响应头
Server能帮助判断。 - 记录上下文:我通常会记下
请求URL + 状态码 + 响应时间,组合起来能更快定位问题。
踩过的坑:有一次线上报警全是502,我盯着后端日志看了两小时,结果发现是Nginx upstream配置写错了地址。从那以后我看到502一定先查网关配置。
2.8 小结
现在你再抓包看状态码,心里应该有数了。200开心,301/302跳转,400/401/403/404基本是客户端的事,500/502/503/504让后端去查。嗯,就这么简单。