统一响应
{
"code": "USER_NOT_FOUND",
"message": "用户不存在",
"traceId": "8f12a...",
"data": null
}优秀的 API 设计是后端系统的基石。从资源命名到错误处理,从认证鉴权到版本控制,系统化掌握 RESTful API 设计的最佳实践与原则,构建优雅可维护的 Web API。
REST(Representational State Transfer)是一种架构风格,而非协议。它利用 HTTP 协议的特性来设计 Web API,强调资源导向和统一接口。
使用名词复数表示资源集合,避免动词。层级关系用斜杠表示,查询参数用于过滤和排序。
| 方法 | 语义 | 幂等 | 安全 | 请求体 | 响应体 |
|---|---|---|---|---|---|
| GET | 获取资源 | ✅ | ✅ | 无 | 资源表示 |
| POST | 创建资源 | ❌ | ❌ | 创建内容 | 新资源 |
| PUT | 完整替换 | ✅ | ❌ | 完整资源 | 更新后资源 |
| PATCH | 部分更新 | 可设计 | ❌ | 差异字段 | 更新后资源 |
| DELETE | 删除资源 | ✅ | ❌ | 无 | 空/确认 |
推荐将版本号放在 URL 路径中(/api/v1/),便于浏览和调试。也可以通过请求头 Accept: application/vnd.example.v1+json 实现内容协商。
正确使用 HTTP 方法是 RESTful API 的核心。每种方法都有明确的语义、幂等性和安全性要求。
幂等且安全,不改变服务端状态。可被缓存。查询参数用于过滤、排序、分页。
非幂等,每次调用可能创建不同资源。返回 201 Created 及新资源 Location 头。
幂等,客户端提供完整的资源表示。缺失字段视为置空或默认值。返回 200 OK。
非幂等,只传递需要修改的字段。支持 JSON Patch (RFC 6902) 或 Merge Patch (RFC 7396)。
幂等,删除后后续 DELETE 返回 404。可返回 204 No Content 或 200 OK。
选择合适的 HTTP 状态码能让客户端准确理解请求结果。以下是常用的状态码及其使用场景。
200 OK — GET/PUT/PATCH 成功返回资源 201 Created — POST 创建成功,返回 Location 头 202 Accepted — 异步任务已接受,稍后处理 204 No Content — DELETE 成功,无返回体
301 Moved Permanently — 资源永久迁移 302 Found — 临时重定向 304 Not Modified — 缓存未过期 (ETag/If-None-Match) 307 Temporary Redirect — 临时重定向,保持 HTTP 方法
400 Bad Request — 请求格式错误 401 Unauthorized — 未认证,需要登录 403 Forbidden — 已认证但无权限 404 Not Found — 资源不存在 405 Method Not Allowed — 方法不允许 409 Conflict — 资源冲突(如重复创建) 422 Unprocessable Entity — 校验失败 429 Too Many Requests — 请求限流
500 Internal Server Error — 服务端内部错误 502 Bad Gateway — 网关/代理错误 503 Service Unavailable — 服务暂时不可用 504 Gateway Timeout — 网关超时
统一的错误响应格式让客户端能够一致地处理各种错误情况。建议遵循 RFC 7807 Problem Details 规范。
AUTH_TOKEN_EXPIREDAccept-Language 头切换trace_id 便于服务端排查分页是列表接口的基础能力。Offset 分页和 Cursor 分页各有适用场景,选择合适的方式能显著提升性能。
适用于:数据量不大(<10万条),支持跳页,按创建时间排序的场景。缺点:深分页性能差(OFFSET 偏移)。
适用于:大数据量、实时性高的场景。基于索引(主键/时间戳)定位,性能稳定。缺点:不支持随机跳页。
选择合适的认证方式对 API 安全性至关重要。以下是三种主流认证方案的对比和最佳实践。
无状态认证,token 包含用户信息和 claims。服务端无需存储 session,适合分布式架构。
授权框架,允许第三方应用获取有限的资源访问权限。支持授权码、客户端凭证等多种流程。
最简单的认证方式,适用于服务端到服务端、公共 API 或内部工具。通过 Header 或查询参数传递。
API 版本管理是保证向后兼容性的关键策略。不同的版本控制方式在可维护性和易用性上各有优劣。
优点:直观、易于调试、支持 CDN 缓存、适合大型公共 API。
缺点:URL 不够简洁、版本升级成本高。
优点:URL 干净、支持细粒度版本控制、适合媒体类型变化。
缺点:调试不便、工具兼容性差、对新手不友好。
Sunset: Sat, 31 Dec 2025 23:59:59 GMTDeprecation 头提示客户端即将弃用高质量的 API 文档是开发者体验的核心。使用 OpenAPI/Swagger 规范和自动化工具,让文档与代码同步。
交互式 API 文档浏览,支持在线调试
美观的静态 API 文档渲染
Spring Boot 集成 OpenAPI 自动生成
维护清晰的版本变更日志,标注 breaking changes
Rate Limiting 是保护 API 不被滥用的重要机制。通过标准化的响应头告知客户端当前的限流状态。
| 算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 令牌桶 | 以固定速率添加令牌,请求消耗令牌 | 允许突发流量,实现简单 | 允许桶容量范围内突发 |
| 漏桶 | 请求进入队列,以固定速率处理 | 流量平滑,输出稳定 | 无法应对突发 |
| 固定窗口 | 时间窗口内计数,超限拒绝 | 实现最简单 | 窗口边界突发 |
| 滑动窗口 | 基于时间区间的精确计数 | 限流均匀,避免边界问题 | 实现较复杂 |
Richardson Maturity Model(RMM)定义了 REST API 的四个成熟度等级,帮助团队渐进式地提升 API 质量。
使用 HTTP 作为传输隧道,一个 URL 一个方法(通常是 POST),所有操作通过请求体区分。常见于早期 SOAP/XML-RPC。
引入资源概念,每个资源有独立 URL。但仍使用单一 HTTP 方法。
正确使用 HTTP 方法语义(GET/POST/PUT/DELETE),结合状态码表达结果。这是大多数 API 的目标级别。
响应中包含链接(links),客户端通过链接发现可执行的操作,实现超媒体驱动。
_links 或 links 字段包含相关资源链接{
"code": "USER_NOT_FOUND",
"message": "用户不存在",
"traceId": "8f12a...",
"data": null
}GET /api/orders?cursor=xxx&limit=20&sort=-createdAt&fields=id,status,totalPOST /api/payments
Idempotency-Key: order_1001_pay_1Deprecation: true
Sunset: Wed, 30 Dec 2026 23:59:59 GMTHTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
Retry-After: 60{
"items": [],
"nextCursor": "eyJpZCI6MTAwMX0=",
"hasMore": true
}components:
schemas:
ErrorResponse:
required: [code, message, traceId]