HTTP状态码全解析
1. 状态码分类
类别 | 范围 | 含义 |
---|---|---|
1xx | 100-199 | 信息性:请求被接收,需进一步处理(临时响应) |
2xx | 200-299 | 成功:请求被正确处理 |
3xx | 300-399 | 重定向:需后续操作完成请求(如跳转到新URL) |
4xx | 400-499 | 客户端错误:请求无效或权限不足(问题在客户端或请求本身) |
5xx | 500-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
头)。
- 返回新资源的URL(如
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
)。
- 检查路由配置(如Spring的
405 Method Not Allowed
- 含义:请求方法不支持。
- 常见原因:
- 客户端使用
POST
请求访问GET
接口。
- 客户端使用
- 解决方案:
- 返回
Allow
头列出允许的方法(如GET, POST
)。
- 返回
415 Unsupported Media Type
- 含义:请求内容类型不支持。
- 常见原因:
Content-Type
与服务器要求不符(如application/xml
vsJSON
)。
- 解决方案:
- 检查请求头中的
Content-Type
。
- 检查请求头中的
429 Too Many Requests
- 含义:请求过多(防爬虫)。
- 常见原因:
- 客户端频繁请求超出配额。
- 解决方案:
- 返回
Retry-After
头提示重试时间。
- 返回
6. 5xx(服务器错误)
500 Internal Server Error
- 含义:服务器内部错误。
- 常见原因:
- 代码异常(如空指针)、依赖服务超时。
- 解决方案:
- 检查日志(如Spring Boot的
application.log
)。
- 检查日志(如Spring Boot的
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 | 服务器内部错误 | 重试或联系管理员 | 记录日志并返回通用错误 |
最佳实践
- 错误处理:
- 统一异常处理(如Spring的
@ControllerAdvice
)。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<String> handleNotFound() { return ResponseEntity.status(404).body("Resource not found"); } }
- 统一异常处理(如Spring的
- 安全建议:
- 避免暴露敏感信息(如500错误中不显示堆栈)。
- 性能优化:
- 对
200 OK
启用缓存(如Cache-Control: max-age=3600
)。
- 对
技术延伸
学习路径
- 深入HTTP协议:阅读RFC 7231/7540。
- API设计:学习RESTful最佳实践(如《REST API设计指南》)。
- 微服务错误处理:研究分布式追踪(如OpenTelemetry)。
生产案例
- 电商系统:通过
429 Too Many Requests
限制恶意爬虫。 - 云服务:使用
503 Service Unavailable
触发自动扩容。
开放性问题
- 如何在不修改状态码的情况下增强错误响应的可读性?
- 当
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()
。