200 OK vs 201 Created vs 204 No Content
标准的“一切正常”响应,带有响应体。
请求成功创建了一个新资源,通常出现在 POST 之后。
成功,但没有响应体。常见于不需要返回数据的 DELETE 或 PUT 调用之后。
三者都是成功状态码,区别在于响应里带了什么。201 应该包含一个指向新资源的 Location 头;204 按定义就是空的。
可搜索的 HTTP 状态码大全,每个都有通俗易懂的解释。
最后更新
Coddy 让你在浏览器里编写真实代码来学习:互动课程、即时反馈,卡住时还有 AI 帮忙。
HTTP 状态码是服务器在每个响应开头返回的三位数字,用来概括请求的结果。浏览器、客户端、代理和 CDN 都靠它来决定是缓存、重定向、重试,还是把错误显示给用户。
每个状态码都按第一位数字归入五类之一:1xx 信息,2xx 成功,3xx 重定向,4xx 客户端错误,5xx 服务器错误。知道了类别,不用查具体的状态码,通常也能猜出大致含义。
大多数应用只用到一小部分核心状态码(200、201、204、301、302、304、400、401、403、404、409、422、429、500、502、503)。弄清每个状态码的含义,以及 401 Unauthorized 和 403 Forbidden、301 Moved Permanently 和 302 Found 之间的区别,会让你成为更出色的后端或 API 开发者。
4xx 表示客户端出了错(输入有误、缺少身份验证、资源不存在)。5xx 表示无论客户端做了什么,服务器都处理失败了。401 vs 403、301 vs 308、200 vs 204,这些区别会影响缓存和重试。输入数字(404、429)或关键词(auth、redirect、rate limit),匹配的状态码会实时筛选出来。
随便浏览而不是搜索时,可以用类别标签(1xx、2xx、3xx、4xx、5xx)缩小列表范围。
每个条目都写明了该状态码何时发送、客户端通常如何处理,以及最常见的原因。
借助容易混淆的状态码之间的“另见”链接(401 vs 403、301 vs 302),为你的 API 选出合适的那个。
HTTP 状态码的五个类别及其含义一览。由 RFC 9110 定义,并登记在 IANA HTTP 状态码注册表中。
| 类别 | 含义 | 常见状态码 |
|---|---|---|
| 1xx 信息 | 请求已收到,正在处理 | 100, 101, 103 |
| 2xx 成功 | 请求成功 | 200, 201, 204, 206 |
| 3xx 重定向 | 去别处找 | 301, 302, 304, 307, 308 |
| 4xx 客户端错误 | 请求本身有问题 | 400, 401, 403, 404, 409, 422, 429 |
| 5xx 服务器错误 | 服务器未能完成一个有效的请求 | 500, 502, 503, 504 |
标准的“一切正常”响应,带有响应体。
请求成功创建了一个新资源,通常出现在 POST 之后。
成功,但没有响应体。常见于不需要返回数据的 DELETE 或 PUT 调用之后。
三者都是成功状态码,区别在于响应里带了什么。201 应该包含一个指向新资源的 Location 头;204 按定义就是空的。
资源真的搬家了(品牌更名、URL 结构调整)时用 301。短期的重定向,比如 A/B 测试、登录跳转或维护页面,用 302。
如果换一套凭据可能就能解决,返回 401。如果什么凭据都没用(这个资源就是不对该用户开放),返回 403。
通用的服务器错误:你的代码抛出了一个未处理的异常。
网关错误:前面的代理(CDN、负载均衡器)连不上上游服务器。
服务不可用:服务器在运行,但负载过高或正处于维护模式。
网关超时:代理连上了上游,但没有及时收到响应。
四个都是服务器错误,但给调试者的线索截然不同。500 指向你的应用;502 和 504 指向网络链路;503 指向容量问题。
200 OK,却在响应体里放 {"error": "..."}。状态码是约定的一部分,要用对(400、404、500),客户端才能据此做分支判断。401 表示权限错误。401 针对的是身份验证;拒绝访问应该用 403。200,而不是带 Location 头的 201。404。这样能防止别人探测资源是否存在,但也会让本来有权限的客户端摸不着头脑。403 通常更清楚。429 Too Many Requests 和 503 Service Unavailable 搞混。针对单个客户端的限流用 429,整体过载用 503。404 Not Found 表示服务器理解了请求,但该 URL 对应的资源不存在。最常见的原因是路径错误、资源已被删除,或者 URL 拼错了。401 Unauthorized 表示你没有通过身份验证,服务器不知道你是谁。403 Forbidden 表示你已通过身份验证,但没有访问该资源的权限。换一套凭据也许能解决 401,但解决不了 403。301 Moved Permanently 是永久重定向,浏览器和搜索引擎会更新记录。302 Found 是临时重定向,客户端之后仍会访问原来的 URL。永久迁移用 301,临时绕道用 302。500 Internal Server Error 是一个通用的服务器端错误,通常在未处理的异常一路冒泡上来时抛出。客户端没做错任何事,是你的服务器没能处理一个有效的请求。200 OK,或者出什么错都返回 500,会让 API 更难用。选最贴切的那个状态码:客户端、代理、监控和重试逻辑都要根据状态码做分支判断。429 Too Many Requests。响应中应该包含一个 Retry-After 头,告诉客户端什么时候可以安全地重试。403 Forbidden 表示服务器理解了请求,也知道你是谁,但拒绝让你访问该资源。和 401 不同,重新登录也没用:你的账号就是没有权限。常见原因包括缺少角色或权限范围、IP 白名单限制,或者资源是其他用户私有的。502 Bad Gateway 表示充当代理或网关的服务器(CDN、负载均衡器或反向代理)把你的请求转发给上游服务器后,收到了无效或空的响应。它通常说明后端宕机、崩溃或配置有误,而不是你的请求有问题。共有五个类别(1xx 至 5xx),在 IANA 登记的标准状态码大约有 60 个,不过大多数很少用到。实际的日常 Web 和 API 开发中,常用的核心状态码大约 15 到 20 个:200、201、204、301、302、304、400、401、403、404、409、422、429、500、502 和 503。上方可搜索的列表收录了所有标准状态码,并配有通俗的说明。