第 1 章:API 接口设计核心原则 —— RESTful 风格、资源命名规范、版本控制策略

支付 SDK 对接是 API 设计质量的“试金石”——接口定义稍有模糊,就会引发联调混乱、签名错误甚至资金损失。本章从三个底层维度出发,建立一套可落地的高质量 API 设计基准,后续所有支付接口定义都将严格遵循这些原则。

1.1 RESTful 风格:以资源为中心的架构约束

REST(Representational State Transfer)不是协议,而是一组架构约束。在支付系统中,约束尤其关注无状态和统一接口:

  • 无状态性:每个请求包含鉴权、上下文、幂等键等全部必要信息,服务器不保存客户端会话状态。
  • 统一接口:每个资源通过唯一 URI 标识,通过标准 HTTP 方法进行操作,通过媒体类型(如 JSON)自描述。
  • 缓存能力:利用 HTTP 原生缓存机制减少重复查询(如订单状态查询)。
黄金法则:资源是名词,不是动词。/getUsers 是错误的,正确的做法是 GET /users。

标准 HTTP 方法映射

方法作用幂等性安全性典型支付场景
GET获取资源是是查询订单状态
POST创建资源否否创建支付订单
PUT全量更新资源是否覆盖退款配置
PATCH部分更新资源否否更新订单备注
DELETE删除资源是否取消未支付订单

1.2 资源命名规范:可读且一致的结构

命名风格直接影响 SDK 对接效率。支付体系核心资源包括 orders、payments、refunds、merchants 等,命名需遵守以下约定:

  • 全部小写 + 连字符:merchant-settings 而非 merchantSettings 或 merchant_settings。
  • 使用复数名词:/v1/orders 而非 /v1/order。
  • 层级关系:/merchants/{merchantId}/orders/{orderId}/items。
  • 路径参数 vs 查询参数:路径参数用于标识唯一资源(/users/{userId}),查询参数用于筛选排序(/orders?status=paid)。
支付 SDK 实践:支付领域对幂等性和一致性要求极高。严格的资源命名配合幂等键(Idempotency-Key)是防止重复支付的基石。

1.3 版本控制策略:管理 API 演进的生命线

版本控制不是可选项,而是契约保障。支付接口涉及资金,变更必须平滑过渡。常见策略如下:

策略示例优点缺点
URI 路径/v1/orders最直观,路由明确,易于缓存URI 不够简洁,版本号不易剥离
请求头Accept: application/vnd.api+json;version=1URI 干净整洁调试不方便,浏览器无法直接测试
查询参数/orders?version=1实现简单,兼容旧客户端破坏 URI 作为资源唯一标识的语义
版本控制陷阱:永远不要省略 API 版本号。即使内部微服务,也必须通过版本控制隔离破坏性变更。一旦发布,删除或重命名字段都可能导致下游支付链路断裂。

综合对比:好设计 vs 坏设计

以下对比总结了上述原则的实际效果:

  • 坏设计(违反 RESTful 与命名规范):
POST /getUserInfo?id=1
POST /deleteOrder
GET /v2.1/createItem
GET /merchants?id=123&type=getSettings
  • 好设计(符合核心原则):
GET    /v1/users/{userId}
DELETE /v1/orders/{orderId}
POST   /v1/items
GET    /v1/merchants/{merchantId}/settings
设计自检清单:① URI 是否仅包含名词?② 是否使用正确的 HTTP 方法?③ 是否包含版本号?④ 路径参数是否用于标识资源?⑤ 响应是否有统一的 error 结构?
RESTful API 核心原则交互流程 RESTful API 核心原则分层交互流程 客户端层 服务接入层 资源定义层 动作映射层 核心处理层 客户端发起 API 请求 版本控制策略 /v1/ 资源命名规范 /users HTTP 方法映射 (GET) 无状态业务逻辑处理 标准化 RESTful 响应 无状态约束 每个请求包含鉴权、上下 文等全部信息,服务器不 保存客户端历史状态。 版本控制演进 通过 URI 路径标识版本 向后兼容,允许旧版 本接口逐步废弃。 统一接口定义 每个资源对应唯一 URI, 通过 CRUD 方法操作, 响应格式自描述。