网络 HTTP

HTTP 状态码,我真正用到的也就这几个

面试的时候背状态码,工作中真正打交道的就八个。今天按"什么场景该用哪个"捋一遍,顺带说说我见过的误用。

200 与 204:写接口成功后,如果没有响应体,用 204 比 200 干净。DELETE 成功返回 204 是最典型的场景。用 200 加一个空 JSON 对象也能活,但客户端要写多余的判空。

304:它不是你的代码返回的,是协商缓存的产物。配置好 ETag 或 Last-Modified 后,浏览器带 If-None-Match 来问,服务器说没变,就是 304。手动在业务代码里返回 304 通常都是错的。

400 与 422:参数格式坏掉用 400(JSON 都解析不了、缺字段),格式对但语义不合法用 422(邮箱格式不对、数量是负数)。很多框架只给 400,那就统一 400,别一半 400 一半 422 让前端猜。

401 与 403:401 是"你是谁都没搞清楚"(没登录、token 过期),403 是"知道你是谁但你不行"(权限不够)。最常见的误用是登录过期返回 403,前端拦截器就分不清该跳登录页还是弹无权限提示。

404 与 410:资源真没了用 404 没毛病,但下架类资源用 410(Gone)可以让爬虫更快忘掉这个 URL。

429:限流。必须配 Retry-After 头,否则客户端只能瞎猜重试间隔,容易制造重试风暴。

最后一条经验:状态码只有配合响应体里的业务码才有表达力。HTTP 层说"这次请求成没成",业务层说"成了之后是什么结果",两层别混。