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)。 - 可缓存性:通过响应头控制缓存策略,提升性能。
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 | 服务暂时不可用 | 评分通道熔断、依赖服务超时 |
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(限流)的使用。