Skip to content

Http响应码

1xx - 信息性状态码 (Informational)

这类状态码表示服务器已经接收到了请求,客户端可以继续发送请求的剩余部分,或者如果请求已经完成,客户端可以忽略这个响应。在日常开发中我们直接接触得比较少。

  • 100 Continue:

    这个状态码表示服务器已经收到了请求头,并且客户端应该继续发送请求体。这是一种优化机制,比如在客户端要上传一个非常大的文件时,它可以先发送一个带有Expect: 100-continue头信息的请求,服务器如果愿意接收,就返回100,客户端再开始传输文件主体。如果服务器不接受,就可以直接拒绝,避免了大量数据的无效传输。

2xx - 成功状态码 (Success)

这类状态码表示服务器已成功接收、理解并处理了客户端的请求。这是我们最期望看到的结果。

  • 200 OK:

    这是最常见的成功状态码。表示请求已成功,响应体中包含了请求的资源。

    • 场景:GET /api/users/1 请求成功,服务器返回用户1的信息,状态码就是200。
  • 201 Created:

    表示请求已经被成功处理,并且在服务器上创建了一个新的资源。响应头中的Location字段通常会包含新资源的URL。

    • 场景:POST /api/users 请求创建一个新用户。服务器成功创建后,返回201,并在Location头中附上新用户的地址,如/api/users/123
  • 202 Accepted:

    表示服务器已经接受了请求,但尚未完成处理。这个状态码用于异步任务。服务器告诉客户端:“你的请求我已经收下了,正在排队处理,但还没处理完。”

    • 场景:用户请求导出一个大型报表。这是一个耗时操作,后端服务可以立即返回202,表示任务已提交。客户端可以通过轮询另一个接口来查询任务状态。
  • 204 No Content:

    表示服务器成功处理了请求,但没有返回任何内容(响应体为空)。

    • 场景:DELETE /api/users/1 请求删除一个用户。操作成功后,服务器不需要返回额外信息,只需告诉客户端“删掉了”,此时返回204非常合适。

3xx - 重定向状态码 (Redirection)

这类状态码表示客户端需要采取进一步的操作才能完成请求,通常是需要访问另一个URL。

  • 301 Moved Permanently:

    表示请求的资源已被永久移动到新的URL。浏览器和搜索引擎会记住这个新地址。

    • 场景:网站进行域名更换,比如从http://example.com迁移到https://www.example.com,配置301重定向后,搜索引擎会更新它的索引。
  • 302 Found (或 Moved Temporarily):

    表示资源被临时移动到了另一个URL。客户端在后续的请求中应该继续使用原始URL。

    • 场景:最常见的未登录跳转。用户访问一个需要登录的页面,服务器发现用户未登录,返回302,并Location到登录页。用户登录成功后,再被重定向回来。
  • 304 Not Modified:

    这是一种缓存优化机制。当客户端进行条件请求(比如请求头中带有If-None-Match或If-Modified-Since字段)时,服务器发现资源自上次请求以来没有发生变化,就会返回304,告诉客户端可以直接使用本地缓存,从而节省带宽。

4xx - 客户端错误状态码 (Client Error)

这类状态码表示请求包含了错误的语法或无法被执行,问题出在客户端这边。

  • 400 Bad Request:

    这是一个非常通用的客户端错误码,表示服务器无法理解客户端的请求。

    • 场景:请求参数格式错误,比如要求是JSON格式,但客户端发送了错误的格式;或者请求的参数不满足校验规则,比如邮箱格式不正确。
  • 401 Unauthorized:

    表示请求需要用户认证。虽然名字叫“未授权”,但它的准确含义是“未认证”。服务器不知道你是谁。响应头中通常会包含WWW-Authenticate字段,用以提示认证方式。

    • 场景:用户未登录(没有提供Token或Cookie)就尝试访问需要登录才能查看的接口。
  • 403 Forbidden:

    表示服务器已经理解了请求,但是拒绝执行。与401不同,服务器知道你是谁,但你就是没有权限访问这个资源。

    • 场景:一个普通用户尝试访问只有管理员才能访问的管理后台接口,即使他已经登录,也会收到403。
  • 404 Not Found:

    这是最广为人知的状态码了,表示服务器上没有找到请求的资源。

    • 场景:访问一个不存在的URL,比如GET /api/users/non-exist-user
  • 405 Method Not Allowed:

    表示请求行中指定的请求方法(如GET、POST)不被目标资源所支持。

    • 场景:一个只允许GET请求的接口,客户端却用了POST方法去调用。
  • 409 Conflict:

    表示请求与服务器当前的状态存在冲突,导致请求无法完成。

    • 场景:创建一个新用户时,指定的用户名或邮箱已经被其他人注册了。

5xx - 服务器端错误状态码 (Server Error)

这类状态码表示服务器在处理一个看似有效的请求时,内部发生了错误。问题出在服务器这边。

  • 500 Internal Server Error:

    这是一个非常通用的服务器错误码,表示服务器内部遇到了一个无法处理的意外情况。

    • 场景:代码中出现了一个未被捕获的异常(比如空指针),导致程序崩溃。这是一个“兜底”的错误码。
  • 502 Bad Gateway:

    通常用在有网关或代理的架构中。它表示作为网关或代理的服务器,从上游服务器(比如应用服务器)收到了一个无效的响应。

    • 场景:Nginx作为反向代理,后面的应用服务(比如Tomcat)挂了或者没有正常响应,Nginx就会返回502。
  • 503 Service Unavailable:

    表示服务器当前无法处理请求。这通常是临时的,可能是因为服务器过载或正在进行停机维护。

    • 场景:服务正在进行版本发布;或者由于流量洪峰,导致服务器资源耗尽,无法再接受新的请求。
  • 504 Gateway Timeout:

    同样用于网关或代理。它表示作为网关的服务器,在规定时间内没有收到来自上游服务器的响应。

    • 场景:Nginx反向代理了一个请求给应用服务器,但应用服务器因为执行一个非常慢的数据库查询而长时间没有返回结果,超出了Nginx的等待超时时间。