接口设计原则:RESTful 设计规范、资源命名、HTTP 方法选择、状态码设计
在构建图谱评分 API 时,遵循统一的接口设计原则是保障系统可维护性、可扩展性与团队协作效率的基石。RESTful 风格是目前业界最广泛采用的 API 设计范式,其核心在于将后端功能抽象为“资源”,并通过标准的 HTTP 协议进行操作。本章将围绕资源命名、HTTP 方法选择与状态码设计三个关键维度展开,确保你的图谱评分接口既符合规范,又具备良好的可读性与自描述能力。
2.1 RESTful 设计核心规范
REST(Representational State Transfer)是一种架构风格,而非强制标准。对于图谱评分 API,我们重点关注以下六项约束,它们共同保证了接口的轻量、无状态与统一接口特性:
- 客户端-服务器分离:前端只关心 UI 与交互,后端只负责数据存储与业务逻辑,两者通过 API 契约解耦。
- 无状态:每次请求必须包含所有必要信息,服务器不保存客户端上下文。评分请求中需携带完整的图谱 ID、评分维度与认证令牌。
- 可缓存:响应应明确标记是否可缓存(如评分规则列表可缓存,单次评分结果不可缓存),以提升性能。
- 统一接口:通过标准 HTTP 方法(GET/POST/PUT/DELETE)操作资源,并使用统一的状态码反馈结果。
- 分层系统:客户端无需知道直接通信的是网关、负载均衡器还是应用服务器,各层职责独立。
- 按需代码(可选):服务器可临时向客户端传输可执行代码(如评分脚本),但本课程中不强制使用。
设计提示:图谱评分 API 属于数据密集型接口,建议严格遵循“无状态”原则。不要在服务端 Session 中存储评分进度,每次请求都应独立完成一个完整的评分操作或查询。
2.2 资源命名规范
资源是 RESTful API 的核心抽象。图谱评分 API 中的资源命名应遵循以下规范,以保证 URL 的直观性与一致性:
| 规范项 | 推荐做法 | 反例 |
|---|---|---|
| 使用名词复数 | /graphs、/scores、/rules |
/getGraph、/graphScore |
| 小写字母 + 连字符 | /score-rules、/graph-versions |
/scoreRules、/graph_versions |
| 层级关系用斜杠 | /graphs/{graphId}/scores |
/graphs/{graphId}/getScores |
| 查询参数过滤 | /scores?status=completed |
/scores/completed |
| 避免动词 | /graphs/{graphId}/publish(特殊动作可用) |
/graphs/{graphId}/doPublish |
图谱评分 API 资源路径示例:
# 图谱资源
GET /graphs # 获取图谱列表
POST /graphs # 创建新图谱
GET /graphs/{graphId} # 获取单个图谱详情
PUT /graphs/{graphId} # 更新图谱信息
DELETE /graphs/{graphId} # 删除图谱
# 评分资源(子资源)
GET /graphs/{graphId}/scores # 获取某图谱的所有评分
POST /graphs/{graphId}/scores # 对图谱发起一次评分
GET /graphs/{graphId}/scores/{scoreId} # 获取单次评分详情
# 评分规则资源
GET /score-rules # 获取评分规则列表
POST /score-rules # 创建新评分规则
2.3 HTTP 方法选择
每个 HTTP 方法对应一种标准操作,图谱评分 API 中应严格区分使用:
| HTTP 方法 | CRUD 对应 | 图谱评分 API 典型用途 | 幂等性 |
|---|---|---|---|
| GET | 读取 | 查询图谱列表、获取评分详情、查看评分规则 | 是 |
| POST | 创建 | 创建新图谱、发起评分、触发评分重算 | 否 |
| PUT | 全量替换 | 更新图谱全部属性、替换评分规则 | 是 |
| PATCH | 部分更新 | 更新图谱名称、修改评分状态 | 否 |
| DELETE | 删除 | 删除图谱、删除评分记录 | 是 |
注意事项:POST 用于创建资源时,服务端应返回 201 Created 状态码及新资源的 Location 头。对于幂等性要求高的操作(如重复提交评分),建议在请求体中引入幂等键(Idempotency-Key),防止重复计分。
2.4 状态码设计
合理的 HTTP 状态码能让客户端无需解析响应体即可判断请求结果。图谱评分 API 应覆盖以下核心状态码:
| 状态码 | 含义 | 图谱评分 API 使用场景 |
|---|---|---|
| 200 OK | 请求成功 | GET 查询成功、PUT/PATCH 更新成功 |
| 201 Created | 资源创建成功 | POST 创建图谱或评分成功 |
| 204 No Content | 操作成功,无返回体 | DELETE 删除成功 |
| 400 Bad Request | 请求参数错误 | 评分维度缺失、图谱 ID 格式错误 |
| 401 Unauthorized | 未认证 | 缺少或无效的 API Token |
| 403 Forbidden | 无权限 | 用户无权操作指定图谱 |
| 404 Not Found | 资源不存在 | 图谱 ID 或评分 ID 不存在 |
| 409 Conflict | 资源冲突 | 创建重复图谱名称、评分版本冲突 |
| 422 Unprocessable Entity | 语义错误 | 评分规则表达式语法错误 |
| 429 Too Many Requests | 限流 | 超过 API 调用频率限制 |
| 500 Internal Server Error | 服务端内部错误 | 评分引擎异常、数据库连接失败 |
| 503 Service Unavailable | 服务暂时不可用 | 系统维护中、评分队列积压 |
最佳实践:对于 4xx 错误,响应体中应包含
error 字段说明具体原因;对于 5xx 错误,建议返回 requestId 便于日志追踪。避免将业务逻辑错误(如评分分数超范围)映射为 500,应使用 400 或 422。
2.5 综合设计示例
以下是一个完整的图谱评分 API 接口设计示例,综合了资源命名、HTTP 方法与状态码规范:
图谱评分 API 接口清单(部分):
# 图谱管理
POST /graphs → 201 Created
GET /graphs → 200 OK
GET /graphs/{graphId} → 200 OK / 404 Not Found
PUT /graphs/{graphId} → 200 OK / 404 Not Found
DELETE /graphs/{graphId} → 204 No Content / 404 Not Found
# 评分操作
POST /graphs/{graphId}/scores → 201 Created / 422 Unprocessable Entity
GET /graphs/{graphId}/scores → 200 OK
GET /graphs/{graphId}/scores/{scoreId} → 200 OK / 404 Not Found
# 评分规则
GET /score-rules → 200 OK
POST /score-rules → 201 Created / 409 Conflict
PUT /score-rules/{ruleId} → 200 OK / 404 Not Found
DELETE /score-rules/{ruleId} → 204 No Content / 404 Not Found
版本管理建议:建议在 URL 前缀中加入版本号,例如
/v1/graphs。当评分算法或资源结构发生不兼容变更时,通过版本号平滑过渡,避免影响已有客户端。