2. API 接口设计原则:RESTful 设计规范、资源命名、HTTP 方法选择、状态码使用

在风控评分通道的 API 设计中,遵循 RESTful 设计规范是构建可维护、可扩展接口的基础。REST(Representational State Transfer)是一种基于资源的架构风格,强调通过统一的接口对资源进行操作。本章将围绕资源命名、HTTP 方法选择、状态码使用三个核心维度展开,并结合风控场景给出具体实践建议。

2.1 RESTful 设计核心思想

RESTful API 的核心是将业务实体抽象为“资源”,每个资源通过唯一的 URI 标识,客户端通过标准的 HTTP 方法对资源进行增删改查。在风控评分通道中,典型的资源包括:评分请求、策略规则、用户画像、黑名单记录等。

关键原则:
  • 无状态性:每个请求包含所有必要信息,服务端不保存客户端上下文。
  • 统一接口:使用标准 HTTP 方法(GET、POST、PUT、DELETE、PATCH)。
  • 资源导向:URI 表示资源,而非操作(如 /api/v1/score 而非 /api/v1/getScore)。
  • 可缓存性:通过响应头控制缓存策略,提升性能。
RESTful 核心原则与风控资源映射 RESTful API 核心 无状态性 统一接口 资源导向 可缓存性 评分请求 策略规则 用户画像 黑名单记录

2.2 资源命名规范

资源命名是 API 设计中最直观的体现。良好的命名规范能降低沟通成本,提升接口的可读性。以下是风控评分通道中的资源命名原则:

原则 说明 正确示例 错误示例
使用名词复数 资源集合使用复数形式 /api/v1/scores /api/v1/getScore
小写字母 + 连字符 多单词用连字符分隔 /api/v1/risk-profiles /api/v1/riskProfiles
层级关系用斜杠 子资源通过路径层级表达 /api/v1/users/{userId}/scores /api/v1/getUserScore?userId=123
避免动词 操作由 HTTP 方法表达 POST /api/v1/blacklist POST /api/v1/addToBlacklist
版本号前置 版本号放在路径最前面 /api/v2/score-rules /api/score-rules/v2
风控场景建议:对于评分通道,建议将 channelId 作为路径参数,例如 /api/v1/channels/{channelId}/scores,便于后续按通道维度进行流量控制和监控。

2.3 HTTP 方法选择

HTTP 方法对应 CRUD 操作,在风控评分通道中,每种方法都有明确的语义和适用场景。选择错误的方法会导致接口语义混乱,增加客户端和服务端的理解成本。

HTTP 方法 CRUD 映射 风控场景示例 请求体 响应体
GET 读取 查询评分记录、获取策略规则详情 无 资源详情或列表
POST 创建 提交评分请求、新增黑名单记录 创建参数 创建成功的资源
PUT 全量更新 更新策略规则(替换全部字段) 完整资源 更新后的资源
PATCH 部分更新 修改评分阈值、更新用户风险等级 部分字段 更新后的资源
DELETE 删除 移除黑名单记录、删除过期策略 无 204 No Content
常见误区:不要使用 GET 方法修改资源状态(如 GET /api/v1/scores?action=approve),这违反了 RESTful 的幂等性语义。修改操作应使用 POST、PUT 或 PATCH。

2.4 HTTP 状态码使用

状态码是 API 响应的重要组成部分,用于告知客户端请求的处理结果。合理使用状态码可以减少客户端对响应体的解析依赖,提升错误处理效率。风控评分通道中常用的状态码如下:

状态码 含义 风控场景说明
200 OK 请求成功 查询评分记录成功,返回评分结果
201 Created 资源创建成功 提交评分请求成功,返回评分 ID
204 No Content 删除成功,无返回体 删除黑名单记录成功
400 Bad Request 请求参数错误 缺少必填字段、参数格式错误
401 Unauthorized 身份认证失败 API Key 无效或过期
403 Forbidden 无权限访问 该通道无权限调用此策略
404 Not Found 资源不存在 查询的评分记录 ID 不存在
409 Conflict 资源冲突 重复提交评分请求(幂等性校验失败)
422 Unprocessable Entity 业务逻辑错误 评分规则配置错误、数据校验不通过
429 Too Many Requests 请求频率超限 超过通道 QPS 限制
500 Internal Server Error 服务端内部错误 评分引擎异常、数据库连接失败
503 Service Unavailable 服务暂时不可用 评分通道熔断、依赖服务超时
状态码在风控评分请求中的流转 客户端 API 网关 评分服务 依赖服务 401 / 429 400 / 422 500 / 503

2.5 实践案例:风控评分请求 API 设计

结合上述原则,以下是一个完整的风控评分请求 API 设计示例:

# 提交评分请求
POST /api/v1/channels/{channelId}/scores
Content-Type: application/json
Authorization: Bearer {apiKey}

{
  "userId": "U123456",
  "transactionId": "TXN20250321001",
  "amount": 15000.00,
  "riskFactors": {
    "deviceId": "DEV-ABC-123",
    "ipAddress": "192.168.1.100"
  }
}

# 成功响应
HTTP/1.1 201 Created
Content-Type: application/json

{
  "scoreId": "SCR-20250321-001",
  "status": "pending",
  "estimatedCompletion": "2025-03-21T10:05:00Z"
}

# 参数错误响应
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error": "INVALID_PARAMETER",
  "message": "字段 'amount' 必须为正数",
  "field": "amount"
}

# 频率超限响应
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 60

{
  "error": "RATE_LIMIT_EXCEEDED",
  "message": "通道 QPS 限制为 100,当前已超限",
  "retryAfterSeconds": 60
}
设计要点总结:
  • 资源路径使用名词复数,版本号前置,层级关系清晰。
  • HTTP 方法严格对应 CRUD 语义,避免语义混淆。
  • 状态码覆盖成功、客户端错误、服务端错误三类场景,错误响应体包含结构化信息。
  • 对于风控场景,特别关注 409 Conflict(幂等性)和 429 Too Many Requests(限流)的使用。