第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 一张图看懂状态码分类

HTTP状态码分类流程图 HTTP状态码 1xx 信息 2xx 成功 3xx 重定向 4xx 客户端 5xx 服务端 200 OK 201 Created 204 No Content 301/302 304 Not Modified 400 Bad Request 401 / 403 404 Not Found 429 限流 500 内部错误 502/504 网关超时 核心口诀 2xx:一切正常;3xx:去别处找;4xx:检查你的请求;5xx:找后端同事 抓包时先看大类,再看具体码,效率最高

2.7 抓包时看状态码的实用技巧

  1. 先看大类:别记全,记住"2成功、3重定向、4我的问题、5服务端问题"就够了。
  2. 留意响应头:有时候服务端会把错误详情塞在X-Error-Code或Retry-After里,比码本身更有用。
  3. 区分Proxy vs Origin:如果经过Nginx/网关,502/504通常来自代理层,500/503多来自后端服务。抓包时看响应头Server能帮助判断。
  4. 记录上下文:我通常会记下请求URL + 状态码 + 响应时间,组合起来能更快定位问题。

踩过的坑:有一次线上报警全是502,我盯着后端日志看了两小时,结果发现是Nginx upstream配置写错了地址。从那以后我看到502一定先查网关配置。

2.8 小结

现在你再抓包看状态码,心里应该有数了。200开心,301/302跳转,400/401/403/404基本是客户端的事,500/502/503/504让后端去查。嗯,就这么简单。