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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值