状态码的含义
1. 1xx(信息性状态码)
- 100(Continue):
含义:客户端应当继续发送请求。这个状态码是作为 HTTP/1.1 协议中一个新特性的一部分引入的,用于客户端在发送请求体之前,先询问服务器是否愿意接收该请求(在请求包含请求体的情况下)。如果服务器返回 100,表示服务器已收到请求头部信息,并且客户端可以继续发送请求体。
示例:当客户端发送一个包含较大请求体的 POST 请求时,先发送请求头,其中包含Expect: 100 - continue字段。如果服务器同意接收请求体,就会返回 100 状态码,然后客户端再发送请求体。
2. 2xx(成功状态码)
- 200(OK):
含义:请求成功。服务器已成功处理请求,并返回请求的资源。这是最常见的成功状态码,通常表示服务器理解了客户端的请求,并按照请求提供了相应的内容,如网页、文件或数据等。
示例:当用户通过浏览器访问一个网页,服务器成功找到并返回该网页的 HTML 内容时,就会返回 200 状态码。 - 201(Created):
含义:请求成功并且服务器创建了新的资源。通常在客户端向服务器发送创建资源的请求(如 POST 请求)后,服务器成功创建了指定的资源时返回。
示例:在一个博客系统中,当用户通过 API 发送一个创建新博客文章的请求,服务器成功创建文章并将其存储在数据库后,会返回 201 状态码,同时在响应头中可能会包含新创建资源的位置(如Location字段),以便客户端后续访问。
3. 3xx(重定向状态码)
- 301(Moved Permanently):
含义:被请求的资源已永久移动到新位置。服务器返回这个状态码时,会在响应头中包含新的资源位置(通常是Location字段)。搜索引擎等客户端在遇到 301 状态码时,会更新其索引,将旧的 URL 指向新的 URL。
示例:一个网站进行了域名更换,旧域名下的网页访问时,服务器会返回 301 状态码,将用户重定向到新域名下对应的网页。 - 302(Found):
含义:资源临时移动。与 301 不同的是,302 表示资源只是临时被移动到其他位置,客户端在后续请求时,仍然可能会访问原始的 URL。服务器同样会在响应头中提供新的位置信息。
示例:在一个网站的维护过程中,某个页面临时被重定向到一个维护通知页面,就可以使用 302 状态码。
4. 4xx(客户端错误状态码)
- 400(Bad Request):
含义:客户端请求有语法错误,服务器无法理解。这可能是由于请求格式错误、参数错误或者请求内容不符合服务器要求等原因导致的。
示例:客户端发送一个 POST 请求,但是请求体中的 JSON 数据格式不符合服务器端预期的格式,如缺少必要的字段或者字段类型错误,服务器就会返回 400 状态码。 - 401(Unauthorized):
含义:客户端请求需要用户认证,但用户未提供认证信息或者认证失败。客户端请求需要用户认证,但用户未提供认证信息或者认证失败。通常在访问受保护的资源时,如果没有提供正确的用户名和密码或者有效的认证令牌,就会返回这个状态码。
示例:在一个需要用户登录才能访问的管理系统中,用户未登录就直接访问管理页面,服务器会返回 401 状态码。 - 403(Forbidden):
含义:服务器理解请求,但拒绝执行,可能是因为用户没有足够的权限访问特定的资源。服务器理解请求,但拒绝执行。这与 401 不同,401 是未认证,403 是已经认证但没有权限。可能是因为用户没有足够的权限访问特定的资源。
示例:普通用户在一个文件管理系统中试图访问只有管理员才能访问的系统配置文件,服务器会返回 403 状态码。 - 404(Not Found):
含义:服务器无法找到请求的资源。这是在 Web 开发中非常常见的状态码,通常表示请求的网页、文件或其他资源不存在。
示例:用户在浏览器中输入了一个错误的 URL,或者网站中某个页面被删除但链接未更新,服务器就会返回 404 状态码。
5. 5xx(服务器错误状态码)
- 500(Internal Server Error):
含义:服务器内部错误。这是一个比较笼统的服务器错误状态码,表示服务器在处理请求时遇到了意外的情况,导致无法完成请求的处理。可能是由于服务器端代码错误、数据库故障等原因导致。
示例:服务器端的 Java 代码在执行某个方法时出现了NullPointerException(空指针异常),导致无法正常处理请求,就会返回 500 状态码。 - 502(Bad Gateway):
含义:作为网关或者代理服务器,从上游服务器接收到无效的响应。通常是因为上游服务器(如后端的应用服务器)出现问题,导致网关或者代理服务器无法正确处理请求。
示例:在一个使用 Nginx 作为反向代理服务器的架构中,如果后端的 Java 应用服务器出现故障,Nginx 在转发请求给后端服务器后收到错误的响应或者无法收到响应,就会返回 502 状态码给客户端。 - 503(Service Unavailable):
含义:服务器目前无法处理请求,可能是由于服务器过载、维护或者其他临时故障导致。服务器通常会在返回 503 状态码的同时,在响应头中提供一个Retry - After字段,告知客户端何时可以再次尝试请求。
示例:在网站进行大规模更新或者遭受高流量攻击时,服务器可能会返回 503 状态码,告诉客户端暂时无法提供服务。
状态码的排查方法
- 客户端排查(浏览器)
-
查看状态码:
在浏览器中,可以通过开发者工具来查看请求的状态码。以 Chrome 浏览器为例,打开开发者工具(可以通过右键点击页面并选择 “检查” 或者使用快捷键Ctrl + Shift + I),切换到 “Network”(网络)选项卡。然后刷新页面或者执行相关操作,在列表中可以看到各个请求的详细信息,包括状态码。 -
检查请求头和请求体:
同样在 “Network” 选项卡中,点击具体的请求,可以查看请求头和请求体的内容。检查请求头是否包含正确的认证信息(如Authorization字段)、正确的Content - Type(内容类型)等。对于 POST 等请求,还要检查请求体中的数据格式是否正确,是否符合服务器的要求。 -
查看响应头和响应内容:
查看响应头可以了解服务器返回的一些额外信息。例如,如果是 301 或 302 状态码,可以查看Location字段确定重定向的位置;如果是 503 状态码,可以查看Retry - After字段了解何时可以再次尝试。同时,查看响应内容可以帮助判断服务器返回的错误信息,有些服务器会在响应体中返回详细的错误描述,如错误消息、堆栈跟踪(在开发环境下)等。
- 服务器端排查(以 Java 应用为例)
-
查看日志文件:
服务器端的日志文件是排查问题的重要依据。在 Java 应用中,通常会使用日志框架(如 Log4j、Slf4j 等)来记录应用的运行情况。查看日志文件,查找与请求相关的错误信息或警告信息。例如,如果是 500 状态码,可能会在日志中发现具体的异常信息,如数据库连接异常、业务逻辑错误等。 -
检查应用配置:
确保应用的配置正确。例如,检查数据库连接配置是否正确,是否能够正常连接数据库;检查认证和授权配置是否符合预期,是否正确地限制了用户的访问权限等。如果是 401 或 403 状态码,可能需要检查认证和授权相关的配置和代码。 -
检查业务逻辑代码:
对于复杂的业务逻辑,可能是代码中的错误导致了状态码异常。例如,在处理请求的控制器方法中,可能存在空指针引用、数组越界等错误。可以通过调试工具(如在 IDE 中设置断点)来逐步检查代码的执行过程,查找可能导致问题的代码块。同时,检查是否正确地返回了响应状态码,有时候可能会错误地返回了不合适的状态码。