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 状态码设计遵循以下分类:

金融图谱 API 状态码分类体系 2xx 成功 200 OK - 查询成功 201 Created - 创建成功 204 No Content - 删除成功 4xx 客户端错误 400 Bad Request - 参数错误 401 Unauthorized - 未认证 404 Not Found - 资源不存在 5xx 服务端错误 500 Internal Server Error 502 Bad Gateway 503 Service Unavailable 金融图谱专用状态码扩展 422 Unprocessable Entity - 图谱校验失败(如循环依赖、数据不一致) 状态码使用原则 • 永远不要返回 200 表示错误,错误必须使用对应的 4xx/5xx 状态码 • 响应体应包含 code、message、details 字段

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 的设计原则可归纳为以下关键要点:

  1. 资源命名:使用名词复数、小写连字符、层级嵌套,避免动词和混合命名风格。
  2. 版本控制:采用 URL 路径版本控制(/api/v1/),明确版本生命周期,保障向后兼容。
  3. 状态码:严格区分 2xx(成功)、4xx(客户端错误)、5xx(服务端错误),金融场景扩展 422 用于图谱校验失败。
  4. 错误响应:统一错误格式,包含 code、message、details,便于客户端自动化处理。
  5. 无状态设计:每个请求携带完整认证信息,不依赖服务端会话,便于水平扩展。
金融合规提醒: 根据《金融数据安全分级指南》,图谱 API 的响应数据不得包含敏感字段(如身份证号、银行账号)。在设计资源模型时,应通过 fields 查询参数控制返回字段,避免数据过度暴露。