平时开发中,大家对200成功、404未找到、500服务器错误这些状态码都很熟悉,但HTTP其实定义了几十个状态码,很多都非常有用却被忽略了。有些能解决实际问题,有些有着有趣的故事,还有些能让你的API设计更专业。觉得有用的同学可以Mark一下。
1. 重定向家族 - 不只是301和302
很多人只知道301永久重定向和302临时重定向,但重定向家族其实很庞大,每个都有特定的使用场景:
HTTP/1.1 307 Temporary Redirect
Location: https://api.example.com/v2/users
HTTP/1.1 308 Permanent Redirect
Location: https://secure.example.com/api
curl -I -L https://example.com # -I只看headers,-L跟随重定向
调试技巧:如果你的POST接口重定向后变成了GET请求,说明服务器用了301/302,应该改用307/308。
2. 客户端错误的细分 - 不要什么都400
400家族比你想象的丰富,精确使用状态码能让前端开发者快速定位问题:
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer
HTTP/1.1 403 Forbidden
HTTP/1.1 409 Conflict
{
"error": "User with this email already exists"
}
HTTP/1.1 422 Unprocessable Entity
{
"errors": {
"age": ["Age must be between 18 and 120"]
}
}
HTTP/1.1 429 Too Many Requests
Retry-After: 60
调试技巧:看到401先检查token,403检查权限,422检查业务逻辑。
3. 服务端错误的分工 - 告诉用户到底是谁的锅
500家族能精确告知故障责任方,便于运维和用户理解:
HTTP/1.1 502 Bad Gateway
HTTP/1.1 503 Service Unavailable
Retry-After: 3600
HTTP/1.1 504 Gateway Timeout
curl -w "time_total: %{time_total}s\n" https://api.example.com
调试技巧:502通常是应用崩溃,503是主动维护,504是性能问题。
4. 缓存控制神器 - 304和条件请求
304状态码配合条件请求,能大幅减少带宽使用:
GET /api/user/123 HTTP/1.1
If-None-Match: "abc123"
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
HTTP/1.1 304 Not Modified
ETag: "abc123"
Cache-Control: max-age=3600
curl -H "If-None-Match: abc123" https://api.example.com/users/1
调试技巧:频繁的200响应可能说明缓存策略有问题,应该多看到304。
5. 内容协商 - 406和415的正确处理
这两个状态码经常被误用,理解它们能让API更健壮:
GET /api/users HTTP/1.1
Accept: application/xml
HTTP/1.1 406 Not Acceptable
Content-Type: application/json
{
"error": "Only JSON format is supported",
"supported_formats": ["application/json"]
}
POST /api/users HTTP/1.1
Content-Type: text/plain
HTTP/1.1 415 Unsupported Media Type
{
"error": "Content-Type must be application/json"
}
curl -H "Accept: application/xml" https://api.example.com/users
curl -H "Content-Type: text/xml" -d "<user></user>" https://api.example.com/users
6. 断点续传神器 - 206部分内容
下载大文件时网络断了?206状态码配合Range请求,让断点续传成为可能:
GET /download/largefile.zip HTTP/1.1
Range: bytes=1000-2000
HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-2000/5000
Content-Length: 1001
使用场景:视频网站的进度条拖拽、大文件下载的断点续传、移动端的流量节省。
7. 最萌状态码 - 418我是茶壶
这是一个真实存在的HTTP状态码,来源于1998年的愚人节玩笑:
HTTP/1.1 418 I'm a teapot
虽然是个玩笑,但很多网站用它来表示"彩蛋"或特殊情况。比如Google搜索"teapot"时就会返回418。
有趣用法:网站彩蛋、API的特殊响应、程序员的小幽默。
8. 法律限制 - 451因法律原因不可用
这个状态码专门用来表示因为法律原因无法提供内容:
HTTP/1.1 451 Unavailable For Legal Reasons
{
"error": "This content is not available in your region",
"reason": "Copyright restrictions",
"legal_reference": "DMCA takedown notice"
}
状态码451来自小说《华氏451度》(纸张燃点),象征着言论审查。
使用场景:地区版权限制、政府审查、DMCA删除请求。
9. 过早请求 - 425别着急
HTTP/2新增的状态码,表示请求太早了,服务器还没准备好:
HTTP/1.1 425 Too Early
{
"error": "Service is still starting up",
"retry_after": 30
}
使用场景:服务重启期间、缓存预热阶段、定时任务触发前。
结语
HTTP状态码不只是数字,它们承载着丰富的语义信息和有趣的故事。从实用的206断点续传,到有趣的418茶壶,再到严肃的451法律限制,每个状态码都有它存在的意义。正确使用它们,能让你的API更专业,问题排查更高效。
下次遇到HTTP问题时,不妨从状态码开始入手,说不定能更快找到根本原因!
阅读原文:原文链接
该文章在 2025/7/9 9:10:21 编辑过