3. API 设计原则:RESTful 规范、资源命名、版本控制策略、状态码设计
在金融图谱 API 的设计中,遵循统一的 API 设计原则是保障系统可维护性、可扩展性与安全性的基石。本节将围绕 RESTful 架构风格,深入讲解资源命名规范、版本控制策略以及状态码设计的最佳实践。
3.1 RESTful 架构核心原则
REST(Representational State Transfer)是一种基于 HTTP 协议的架构风格,强调资源导向与无状态通信。金融图谱 API 严格遵循以下核心约束:
- 资源导向:每个 URL 代表一个唯一的资源(如实体、关系、图谱),而非操作。
- 无状态性:每个请求包含所有必要信息,服务端不保存客户端上下文。
- 统一接口:使用标准的 HTTP 方法(GET、POST、PUT、PATCH、DELETE)对资源进行 CRUD 操作。
- 自描述消息:通过 MIME 类型(如
application/json)和 HATEOAS 链接指导客户端下一步操作。
金融场景提示: 在查询企业关联图谱时,使用
GET /api/v1/entities/{id}/relationships 而非 GET /api/v1/getRelationships?id=xxx,前者更符合资源语义,便于缓存与权限控制。
3.2 资源命名规范
资源命名直接影响 API 的可读性与一致性。金融图谱 API 采用以下命名规则:
| 规则类别 | 规范说明 | 正确示例 | 错误示例 |
|---|---|---|---|
| 名词复数 | 资源名使用英文复数名词 | /entities, /relationships |
/getEntity, /entity |
| 小写连字符 | 多词组合使用小写字母 + 连字符 | /financial-statements |
/financialStatements, /financial_statements |
| 层级关系 | 通过路径嵌套表达资源归属 | /entities/{id}/relationships |
/relationships?entityId={id} |
| 查询参数 | 过滤、排序、分页使用查询参数 | ?type=equity&page=1 |
/relationships/type/equity |
| 动作分离 | 非 CRUD 操作使用子资源或动词 | /graphs/{id}/analyze |
/analyzeGraph |
最佳实践: 避免在 URL 中使用动词(如
/createEntity),应通过 HTTP 方法表达动作。对于复杂的图谱分析操作,使用 POST /graphs/{id}/analyze 并在请求体中传递参数。
3.3 版本控制策略
API 版本控制是保障向后兼容性的关键。金融图谱 API 采用 URL 路径版本控制 策略,将版本号显式置于路径前缀中:
# 当前稳定版本
GET /api/v1/entities/{id}
# 新版本迭代
GET /api/v2/entities/{id}
版本控制策略对比:
| 策略 | 实现方式 | 优点 | 缺点 | 金融图谱适用性 |
|---|---|---|---|---|
| URL 路径 | /api/v1/... |
显式、易于缓存、便于调试 | URL 较长 | ✅ 推荐 |
| 请求头 | Accept: application/vnd.finance.v1+json |
URL 简洁 | 调试困难、缓存不友好 | ⚠️ 可选 |
| 查询参数 | ?version=1 |
实现简单 | 易被忽略、污染参数空间 | ❌ 不推荐 |
版本生命周期管理: 每个大版本至少维护 12 个月,废弃前需提前 6 个月在响应头
Sunset 中告知客户端。金融监管要求历史数据查询接口需长期保留 v1 版本。
3.4 状态码设计
正确使用 HTTP 状态码能让客户端快速理解请求结果。金融图谱 API 状态码设计遵循以下分类:
3.5 金融图谱 API 状态码详细设计
针对金融图谱业务场景,状态码需要覆盖数据校验、权限控制与业务异常:
| 状态码 | 含义 | 金融图谱场景示例 | 响应体示例 |
|---|---|---|---|
| 200 | OK | 查询实体详情成功 | { "data": { "id": "ent_001", "name": "XX集团" } } |
| 201 | Created | 创建新的关联关系成功 | { "data": { "id": "rel_002" }, "links": { "self": "/api/v1/relationships/rel_002" } } |
| 204 | No Content | 删除图谱节点成功 | 无响应体 |
| 400 | Bad Request | 请求参数缺失或格式错误 | { "code": "INVALID_PARAM", "message": "实体ID不能为空", "details": { "field": "id" } } |
| 401 | Unauthorized | API Key 无效或过期 | { "code": "AUTH_FAILED", "message": "认证失败,请检查 API Key" } |
| 403 | Forbidden | 无权限查看该金融图谱数据 | { "code": "ACCESS_DENIED", "message": "无权访问该资源" } |
| 404 | Not Found | 请求的实体或关系不存在 | { "code": "NOT_FOUND", "message": "实体 ent_999 不存在" } |
| 409 | Conflict | 创建重复的实体唯一标识 | { "code": "DUPLICATE_ENTITY", "message": "实体 'XX集团' 已存在" } |
| 422 | Unprocessable Entity | 图谱校验失败(如循环依赖) | { "code": "GRAPH_VALIDATION_ERROR", "message": "关系创建导致循环依赖", "details": { "cycle": ["ent_001", "ent_002", "ent_003"] } } |
| 429 | Too Many Requests | 超出 API 调用频率限制 | { "code": "RATE_LIMIT_EXCEEDED", "message": "请求过于频繁,请稍后重试", "retry_after": 30 } |
| 500 | Internal Server Error | 图谱数据库连接异常 | { "code": "INTERNAL_ERROR", "message": "服务内部错误,请联系管理员" } |
| 503 | Service Unavailable | 图谱计算引擎过载 | { "code": "SERVICE_OVERLOAD", "message": "服务暂不可用,请稍后重试" } |
错误响应体规范: 所有错误响应必须包含
code(机器可读的错误码)、message(人类可读的描述)和可选的 details(详细错误信息)。金融监管审计要求错误日志必须保留完整的 details 字段。
3.6 设计原则总结
金融图谱 API 的设计原则可归纳为以下关键要点:
- 资源命名:使用名词复数、小写连字符、层级嵌套,避免动词和混合命名风格。
- 版本控制:采用 URL 路径版本控制(
/api/v1/),明确版本生命周期,保障向后兼容。 - 状态码:严格区分 2xx(成功)、4xx(客户端错误)、5xx(服务端错误),金融场景扩展 422 用于图谱校验失败。
- 错误响应:统一错误格式,包含
code、message、details,便于客户端自动化处理。 - 无状态设计:每个请求携带完整认证信息,不依赖服务端会话,便于水平扩展。
金融合规提醒: 根据《金融数据安全分级指南》,图谱 API 的响应数据不得包含敏感字段(如身份证号、银行账号)。在设计资源模型时,应通过
fields 查询参数控制返回字段,避免数据过度暴露。