HTTP状态码根据其首位数字被划分为五大类,每一类都代表了HTTP请求-响应周期中的一个特定阶段或结果。这五大类共同构成了HTTP协议中服务器向客户端反馈请求处理状态的标准体系。

HTTP状态码五大类详解

类别 首位数字范围 类别名称 核心含义 典型状态码示例
1xx 100-199 信息响应 表示请求已被接收,需要客户端继续操作。这类状态码是临时性的,表示服务器正在处理请求,客户端应等待最终响应。 100 Continue, 101 Switching Protocols
2xx 200-299 成功响应 表示请求已成功被服务器接收、理解并接受。这是客户端最希望看到的结果。 200 OK, 201 Created, 204 No Content
3xx 300-399 重定向 表示客户端需要采取进一步的操作才能完成请求。通常用于资源位置发生变更的场景。 301 Moved Permanently, 302 Found, 304 Not Modified
4xx 400-499 客户端错误 表示请求包含语法错误或无法被服务器处理。问题根源在于客户端发送的请求本身。 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx 500-599 服务器错误 表示服务器在处理一个看似有效的请求时发生了错误。问题根源在于服务器端。 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable

各类别深度解析与应用场景

1. 1xx 信息响应

这类状态码表示一个临时的中间状态,通常不会在普通网页浏览中直接看到,但在一些高级协议交互中非常重要。

  • 100 Continue:客户端在发送较大请求体(如上传文件)前,可以先发送一个带有 Expect: 100-continue 头部的请求。服务器如果愿意接受请求体,就会返回100,客户端再继续发送剩余数据。这可以避免网络带宽的浪费。
  • 101 Switching Protocols:在WebSocket握手等场景中,服务器同意客户端提出的协议升级请求(如从HTTP升级到WebSocket协议)时,会返回此状态码。
2. 2xx 成功响应

成功响应的状态码最为常见,但不同代码代表的具体成功含义有所区别。

  • 200 OK:标准成功响应,请求成功,响应体中包含所请求的资源。
  • 201 Created:请求成功并且创建了新的资源(例如通过POST请求新建一篇博客文章)。响应头部的 Location 字段通常会包含新创建资源的URL。
  • 204 No Content:服务器成功处理了请求,但不需要返回任何实体内容。常用于DELETE请求成功后的响应,或表单提交后不希望页面刷新的场景。
  • 206 Partial Content:客户端通过Range头部请求了资源的一部分(如断点续传),服务器成功返回了指定范围的内容时使用。
3. 3xx 重定向

重定向状态码指示客户端需要转向另一个URI来完成请求。这是Web开发中处理URL变更、负载均衡和缓存机制的核心。

  • 301 Moved Permanently永久重定向。请求的资源已被永久移动到新的URI,浏览器和搜索引擎会更新书签、索引,后续请求将直接发往新地址。
  • 302 Found临时重定向。请求的资源临时从不同的URI响应。浏览器会继续使用原地址发起后续请求。这是最常用的临时重定向。
  • 304 Not Modified:这是一个特殊的重定向。当客户端发起条件请求(例如请求头中包含 If-Modified-Since)时,如果资源自指定时间后未被修改,服务器会返回304,告诉客户端可以直接使用本地缓存版本,从而节省带宽。
4. 4xx 客户端错误

这类错误表明问题出在客户端发出的请求上,服务器无法或拒绝处理。

  • 400 Bad Request:请求报文存在语法错误,服务器无法理解。例如JSON请求体格式错误、参数类型不匹配等。
  • 401 Unauthorized:请求需要用户认证。客户端必须提供有效的身份凭证(如用户名和密码)。与403不同,401意味着身份认证后可能被允许访问。
  • 403 Forbidden:服务器理解请求,但拒绝执行。这通常意味着客户端没有访问该资源的权限,即使提供了身份认证也无济于事。
  • 404 Not Found:服务器找不到请求的资源。这是最常见的客户端错误,可能是URL拼写错误,或资源已被删除。
  • 415 Unsupported Media Type:服务器无法处理请求附带的媒体格式。例如,API只接受application/json,但客户端发送了application/xml
5. 5xx 服务器错误

这类错误表明服务器在处理有效请求时内部发生了错误,责任在服务器端。

  • 500 Internal Server Error:最通用的服务器错误状态码,表示服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理。
  • 502 Bad Gateway:作为网关或代理的服务器,从上游服务器收到了一个无效的响应。常见于反向代理服务器(如Nginx)后端的应用服务器(如Tomcat)崩溃或无响应时。
  • 503 Service Unavailable:服务器当前无法处理请求(例如因过载或正在进行停机维护)。通常,响应中会包含一个 Retry-After 头部,告知客户端何时可以重试。
  • 504 Gateway Timeout:作为网关或代理的服务器,未能在规定时间内从上游服务器收到响应。这通常意味着上游服务器处理超时。

开发实践中的状态码处理

在API开发或前端调试中,正确处理和理解状态码至关重要。以下是一个简单的Python示例,演示如何根据不同的HTTP状态码进行不同的处理:

import requests

def handle_http_response(url):
    try:
        response = requests.get(url)
        status_code = response.status_code
        
        # 根据状态码大类进行处理 
        if 100 <= status_code < 200:
            print(f"信息响应 ({status_code}): 请求已接收,继续处理。")
            # 例如,对于101状态码,可能需要升级协议 
            
        elif 200 <= status_code < 300:
            print(f"成功 ({status_code}): 请求成功。")
            # 处理成功响应,如解析JSON数据
            data = response.json()
            return data
            
        elif 300 <= status_code < 400:
            print(f"重定向 ({status_code}): 资源位置已变更。")
            # 获取新的Location并可能进行重定向请求 
            new_url = response.headers.get('Location')
            if new_url:
                print(f"重定向至: {new_url}")
                # 在实际应用中,可能需要递归调用或通知用户
                
        elif 400 <= status_code < 500:
            print(f"客户端错误 ({status_code}): 请检查请求。")
            # 根据具体错误码进行细化处理 
            if status_code == 404:
                print("错误:请求的资源不存在。")
            elif status_code == 403:
                print("错误:权限不足,访问被拒绝。")
            # 可以在这里记录日志或提示用户修正输入
            return None
            
        elif 500 <= status_code < 600:
            print(f"服务器错误 ({status_code}): 服务器内部出现问题。")
            # 对于503错误,可以尝试按照Retry-After头部建议的时间后重试 
            if status_code == 503:
                retry_after = response.headers.get('Retry-After')
                print(f"服务不可用,建议在 {retry_after} 秒后重试。")
            return None
            
    except requests.exceptions.RequestException as e:
        print(f"网络请求异常: {e}")
        return None

# 示例调用
result = handle_http_response("https://api.example.com/data")

理解这五大类状态码及其下的具体代码,是进行Web开发、API调试和网络问题排查的基础技能。通过状态码,开发者和系统可以快速定位问题是出在请求方、网络传输还是服务提供方,从而采取正确的应对策略。


参考来源

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐