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 告知调用方迁移截止日期。
RESTful API 设计原则全景图 RESTful API 设计原则全景图 RESTful API 设计 资源命名规范 HTTP 方法使用 状态码选择 版本控制策略 命名要点 • 名词复数 • 小写+连字符 • 层级用斜杠 • 过滤用查询参数 方法要点 • GET 查询 • POST 创建 • PUT 全量替换 • DELETE 删除 状态码要点 • 2xx 成功 • 4xx 客户端错误 • 5xx 服务端错误 • 语义必须一致 版本要点 • 路径版本 • 递增主版本 • 向后兼容 • 废弃时间线

2.5 设计原则总结

将上述原则应用于日志检索准入门禁自助服务时,可形成以下 API 设计清单:

  1. 资源路径:/api/v1/access-logs、/api/v1/employees/{empId}/badges、/api/v1/approvals。
  2. 方法映射:查询用 GET,创建申请用 POST,更新权限用 PUT,撤销用 DELETE。
  3. 状态码:成功创建返回 201,参数错误返回 400,无权限返回 403,资源不存在返回 404。
  4. 版本控制:当前使用 v1,未来不兼容变更时升级到 v2,v1 保留至少 6 个月过渡期。
核心思想:RESTful 设计不是教条,而是为了降低调用方与服务端的认知负载。当你在门禁自助服务中遇到“是否需要将操作抽象为资源”的困惑时,优先思考“这个操作是否可以被视为一个资源的状态转换”。例如,“审批通过”可以建模为 PATCH /api/v1/approvals/{id} 并传入 {"status": "approved"},而非 POST /api/v1/approvals/{id}/approve。