2、RESTful API 设计原则:资源命名规范、HTTP 方法使用、状态码选择、版本控制策略
RESTful API 是构建日志检索准入门禁自助服务的核心通信契约。遵循统一的设计原则,能显著提升 API 的可读性、可维护性与安全性。本节围绕资源命名、HTTP 方法、状态码与版本控制四大支柱展开。
2.1 资源命名规范
REST 的核心是“资源”(Resource),每个资源通过 URI 唯一标识。命名应使用名词复数,避免动词,并采用小写字母与连字符(-)分隔单词。
| 规范项 | 推荐示例 | 不推荐示例 |
|---|---|---|
| 使用名词复数 | /api/v1/access-logs |
/api/v1/getAccessLogs |
| 层级关系用斜杠 | /api/v1/users/{userId}/cards |
/api/v1/getUserCards?uid=xxx |
| 过滤参数用查询字符串 | /api/v1/access-logs?status=denied |
/api/v1/access-logs/denied |
| 单词分隔用连字符 | /api/v1/self-service/approvals |
/api/v1/selfService/approvals |
最佳实践:在门禁自助服务中,资源路径应反映真实业务实体。例如:
/api/v1/employees/{empId}/badges 表示“某员工的全部门禁卡”,比扁平化的 /api/v1/badges?employeeId=xxx 更符合 REST 层级语义。
2.2 HTTP 方法使用
HTTP 方法对应资源的 CRUD 操作。在日志检索与门禁场景中,方法选择直接影响安全性与幂等性。
| HTTP 方法 | 操作语义 | 幂等性 | 门禁场景示例 |
|---|---|---|---|
| GET | 查询资源 | 是 | 检索某时段日志 |
| POST | 创建资源 | 否 | 提交门禁准入申请 |
| PUT | 全量替换资源 | 是 | 更新门禁卡权限配置 |
| PATCH | 部分更新资源 | 否 | 修改申请单状态 |
| DELETE | 删除资源 | 是 | 撤销已过期的门禁授权 |
注意:POST 用于创建非幂等操作(如提交申请),重复提交会生成多条记录。若需保证幂等性,应在请求头中引入
Idempotency-Key,服务端根据该 key 去重。
2.3 状态码选择
状态码是 API 响应语义的第一道关口。选择恰当的状态码能帮助调用方快速定位问题,减少日志排查成本。
- 2xx 成功:
200 OK— GET、PUT、PATCH 成功返回资源。201 Created— POST 创建资源成功,响应头应包含Location指向新资源 URI。204 No Content— DELETE 成功,或操作成功但无需返回 body。
- 4xx 客户端错误:
400 Bad Request— 请求参数格式错误或校验失败。401 Unauthorized— 未提供或提供了无效的鉴权凭证。403 Forbidden— 已认证但无权限执行操作(如普通员工尝试删除管理员日志)。404 Not Found— 资源不存在。409 Conflict— 资源当前状态冲突(如重复提交已审批的申请)。429 Too Many Requests— 触发限流策略。
- 5xx 服务端错误:
500 Internal Server Error— 未预期的服务端异常。503 Service Unavailable— 服务暂时不可用(如数据库连接池耗尽)。
设计原则:永远不要将 200 OK 用于业务错误。例如,查询日志时若参数缺失,应返回
400 Bad Request 并附带错误描述,而非返回 200 并在 body 中写 {"error": "missing param"}。状态码与 body 语义必须一致。
2.4 版本控制策略
API 版本控制是保障向后兼容、支持渐进式演进的关键。推荐使用 URI 路径版本控制,将版本号显式嵌入路径中。
# 推荐:路径版本控制
GET /api/v1/access-logs
GET /api/v2/access-logs
# 不推荐:请求头版本控制(难以缓存和调试)
GET /api/access-logs
Headers: Accept: application/vnd.company.v1+json
版本号从 v1 开始,每次引入不兼容变更时递增主版本号。小版本(如 v1.1)应保持完全向后兼容,仅通过新增字段或可选参数扩展。
版本生命周期:建议为每个版本设定明确的废弃时间线。例如:v1 发布后,v2 上线时 v1 仍保持可用至少 6 个月,并在响应头中加入
Sunset: Sat, 01 Nov 2025 00:00:00 GMT 告知调用方迁移截止日期。
2.5 设计原则总结
将上述原则应用于日志检索准入门禁自助服务时,可形成以下 API 设计清单:
- 资源路径:
/api/v1/access-logs、/api/v1/employees/{empId}/badges、/api/v1/approvals。 - 方法映射:查询用 GET,创建申请用 POST,更新权限用 PUT,撤销用 DELETE。
- 状态码:成功创建返回 201,参数错误返回 400,无权限返回 403,资源不存在返回 404。
- 版本控制:当前使用
v1,未来不兼容变更时升级到v2,v1 保留至少 6 个月过渡期。
核心思想:RESTful 设计不是教条,而是为了降低调用方与服务端的认知负载。当你在门禁自助服务中遇到“是否需要将操作抽象为资源”的困惑时,优先思考“这个操作是否可以被视为一个资源的状态转换”。例如,“审批通过”可以建模为
PATCH /api/v1/approvals/{id} 并传入 {"status": "approved"},而非 POST /api/v1/approvals/{id}/approve。