当前位置: 首页 > news >正文

HTTP状态码全解析


1. 状态码分类

类别范围含义
1xx100-199信息性:请求被接收,需进一步处理(临时响应)
2xx200-299成功:请求被正确处理
3xx300-399重定向:需后续操作完成请求(如跳转到新URL)
4xx400-499客户端错误:请求无效或权限不足(问题在客户端或请求本身)
5xx500-599服务器错误:服务端处理失败(问题在服务器或依赖服务)

2. 1xx(信息性状态码)

100 Continue

  • 含义:客户端应继续发送请求。
  • 常见原因
    • 客户端发送请求头后,服务器需要确认请求是否可接受(如大文件上传)。
  • 解决方案
    • 客户端在请求头中添加 Expect: 100-continue,等待服务器确认后再发送请求体。
  • 示例代码(Java)
    // Spring Boot控制器
    @PostMapping("/upload")
    public ResponseEntity<String> handleUpload(@RequestBody byte[] file) {
        // 处理文件上传
        return ResponseEntity.status(200).body("Upload successful");
    }
    

101 Switching Protocols

  • 含义:服务器切换协议(如HTTP → WebSocket)。
  • 常见原因
    • 客户端请求协议升级(如Upgrade: websocket)。
  • 解决方案
    • 服务器需支持协议切换(如通过Upgrade头)。
  • 示例代码(Node.js)
    const WebSocket = require('ws');
    const wss = new WebSocket.Server({ noServer: true });
    wss.on('connection', (ws) => {
        ws.on('message', (message) => {
            ws.send(`Received: ${message}`);
        });
    });
    

102 Processing (WebDAV)

  • 含义:服务器已收到请求,正在处理中。
  • 常见原因
    • 长时间处理请求(如批量操作)。
  • 解决方案
    • 客户端需等待最终响应。

103 Early Hints (HTTP/3)

  • 含义:预加载资源(如Link头提供跳转目标)。
  • 常见原因
    • 服务器主动提示客户端预加载资源。
  • 解决方案
    • 在响应头中添加 Link: </related-resource>; rel=preload

3. 2xx(成功状态码)

200 OK

  • 含义:请求成功。
  • 常见原因
    • 资源正常返回。
  • 解决方案
    • 无特殊处理,直接返回数据。

201 Created

  • 含义:资源创建成功。
  • 常见原因
    • POST/PUT请求成功创建新资源。
  • 解决方案
    • 返回新资源的URL(如Location头)。

204 No Content

  • 含义:请求成功,但无响应体。
  • 常见原因
    • 资源更新成功但无需返回数据。
  • 解决方案
    • 仅返回头信息,如Content-Length: 0

206 Partial Content

  • 含义:范围请求成功(如断点续传)。
  • 常见原因
    • 客户端请求部分内容(如Range: bytes=0-100)。
  • 解决方案
    • 返回Content-Range头和部分数据。

4. 3xx(重定向状态码)

301 Moved Permanently

  • 含义:资源永久移动。
  • 常见原因
    • URL永久变更(如域名迁移)。
  • 解决方案
    • 在响应头中设置Location指向新URL,并更新缓存。

302 Found

  • 含义:资源临时移动。
  • 常见原因
    • 临时跳转(如登录后重定向)。
  • 解决方案
    • 客户端需重新请求新URL,但不更新缓存。

304 Not Modified

  • 含义:资源未修改(缓存有效)。
  • 常见原因
    • 客户端缓存未过期(如If-Modified-Since匹配)。
  • 解决方案
    • 返回304并跳过响应体传输。

307 Temporary Redirect

  • 含义:临时重定向(禁止方法改变)。
  • 常见原因
    • 需保留原请求方法(如POST跳转)。
  • 解决方案
    • 客户端需保持原请求方法重定向。

308 Permanent Redirect

  • 含义:永久重定向(禁止方法改变)。
  • 常见原因
    • 永久跳转且保留原方法。
  • 解决方案
    • 客户端需更新缓存并保留方法。

5. 4xx(客户端错误)

400 Bad Request

  • 含义:请求语法错误。
  • 常见原因
    • 参数格式错误(如JSON无效)、请求体过大。
  • 解决方案
    • 校验请求头/参数(如Content-Type是否正确)。

401 Unauthorized

  • 含义:未认证。
  • 常见原因
    • 未提供认证信息(如Token缺失)。
  • 解决方案
    • 返回WWW-Authenticate头提示认证方式(如Bearer)。

403 Forbidden

  • 含义:权限不足。
  • 常见原因
    • 用户无权访问资源(如私有文件)。
  • 解决方案
    • 检查权限配置(如RBAC角色分配)。

404 Not Found

  • 含义:资源不存在。
  • 常见原因
    • URL错误、资源被删除。
  • 解决方案
    • 检查路由配置(如Spring的@RequestMapping)。

405 Method Not Allowed

  • 含义:请求方法不支持。
  • 常见原因
    • 客户端使用POST请求访问GET接口。
  • 解决方案
    • 返回Allow头列出允许的方法(如GET, POST)。

415 Unsupported Media Type

  • 含义:请求内容类型不支持。
  • 常见原因
    • Content-Type与服务器要求不符(如application/xml vs JSON)。
  • 解决方案
    • 检查请求头中的Content-Type

429 Too Many Requests

  • 含义:请求过多(防爬虫)。
  • 常见原因
    • 客户端频繁请求超出配额。
  • 解决方案
    • 返回Retry-After头提示重试时间。

6. 5xx(服务器错误)

500 Internal Server Error

  • 含义:服务器内部错误。
  • 常见原因
    • 代码异常(如空指针)、依赖服务超时。
  • 解决方案
    • 检查日志(如Spring Boot的application.log)。

502 Bad Gateway

  • 含义:代理服务器通信失败。
  • 常见原因
    • 反向代理(如Nginx)无法连接后端。
  • 解决方案
    • 检查后端服务是否正常(如端口是否开放)。

503 Service Unavailable

  • 含义:服务器过载或维护中。
  • 常见原因
    • 服务器资源耗尽(如内存不足)。
  • 解决方案
    • 增加服务器实例或优化资源使用。

504 Gateway Timeout

  • 含义:代理服务器超时。
  • 常见原因
    • 后端服务响应超时(如数据库查询缓慢)。
  • 解决方案
    • 调整代理超时时间或优化后端性能。

7. 扩展与特殊状态码

422 Unprocessable Entity

  • 含义:语义错误(如参数无效但语法正确)。
  • 常见原因
    • 参数值不符合业务规则(如年龄为负数)。

423 Locked

  • 含义:资源被锁定(如WebDAV)。
  • 常见原因
    • 文件被其他会话占用。

511 Network Authentication Required

  • 含义:网络层认证失败。
  • 常见原因
    • WiFi或代理要求用户登录。

8. 对比表格与最佳实践

状态码对比表

状态码含义客户端行为服务器行为
200请求成功处理响应内容返回资源
301永久重定向更新缓存,跳转到新URL返回新URL
400请求语法错误修正请求参数拒绝处理并返回错误信息
500服务器内部错误重试或联系管理员记录日志并返回通用错误

最佳实践

  1. 错误处理
    • 统一异常处理(如Spring的@ControllerAdvice)。
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(ResourceNotFoundException.class)
        public ResponseEntity<String> handleNotFound() {
            return ResponseEntity.status(404).body("Resource not found");
        }
    }
    
  2. 安全建议
    • 避免暴露敏感信息(如500错误中不显示堆栈)。
  3. 性能优化
    • 200 OK启用缓存(如Cache-Control: max-age=3600)。

技术延伸

学习路径

  1. 深入HTTP协议:阅读RFC 7231/7540。
  2. API设计:学习RESTful最佳实践(如《REST API设计指南》)。
  3. 微服务错误处理:研究分布式追踪(如OpenTelemetry)。

生产案例

  • 电商系统:通过429 Too Many Requests限制恶意爬虫。
  • 云服务:使用503 Service Unavailable触发自动扩容。

开放性问题

  1. 如何在不修改状态码的情况下增强错误响应的可读性?
  2. 500 Internal Server Error频繁出现时,如何定位根本原因?

代码仓库与基准测试

  • GitHub仓库:HTTP-Status-Code-Examples
  • JMH基准测试
    @State(Scope.Thread)
    public class StatusCodeBenchmark {
        @Benchmark
        public int test200() {
            return HttpStatus.OK.value();
        }
    }
    

跨平台兼容性

  • JVM环境:直接使用Spring Boot的ResponseEntity
  • Node.js:通过res.status(404).send()

相关文章:

  • kubernetes|云原生|kubeadm-1.25.7集群单master+外部etcd集群+kubeadm-init+cri-docker文件形式快速部署
  • 基于概率图模型的蛋白质功能预测
  • 河南大学数据库实验6
  • 【leetcode题解】链表
  • 【STL】string类
  • SDH(Synchronous Digital Hierarchy,同步数字体系)
  • 如何使用SQL进行多表联合查询(SQLⅰte举例)
  • 爬虫:scrapy面试题大全(60个scrapy经典面试题和详解)
  • Linux作业2——有关文件系统权限的练习
  • CTF【WEB】学习笔记1号刊
  • 【Jwt】详解认证登录的数字签名
  • 缓存设计模式
  • C语言-发布订阅模式详解与实践
  • 【Go】Go语言继承-多态模拟
  • Ubuntu 22.04 二进制安装单节点 MySQL
  • 1. Linux平台OA项目部署步骤
  • 记20个忘10个之八:前缀a-
  • 从头开始学C语言第三十一天——void指针和const指针
  • 表达式括号匹配(stack)(信息学奥赛一本通-1353)
  • 图论 | 岛屿数量(深搜,广搜)
  • 首开股份:一季度净利润亏损约10.79亿元,签约金额63.9亿元
  • 美国清洗政治:一幅残酷新世界的蓝图正在展开
  • 解放日报:中国大模型企业的发展机遇已经到来
  • 病人有头发,照护者不发疯:《黑镜》中的身体缺席与虚伪关怀
  • 美航母一战机坠海,美媒:为躲避胡塞武装攻击,损失超六千万美元
  • 初步结果显示,卡尼领导的加拿大自由党在联邦众议院选举中获胜