3. API设计原则:RESTful规范、资源命名、HTTP方法选择、状态码设计
在信用评分API的设计中,遵循RESTful规范是确保接口可维护性、可扩展性与团队协作效率的基石。本节将围绕资源命名、HTTP方法选择与状态码设计三大核心维度展开,并结合信用评分业务场景给出具体实践指南。
3.1 RESTful核心规范
REST(Representational State Transfer)是一种基于资源的架构风格,强调通过统一的接口对资源进行无状态操作。在信用评分API中,核心资源包括:用户(User)、信用报告(CreditReport)、评分记录(ScoreRecord)、查询授权(Authorization)。
关键约束: 客户端与服务器之间的通信必须是无状态的;每个请求应包含所有必要信息,服务器不保存客户端上下文。
3.2 资源命名规范
资源命名应使用名词复数形式,采用小写字母与连字符(kebab-case),避免使用动词或扩展名。以下是信用评分场景中的资源命名对照表:
| 资源类别 | 推荐命名 | 不推荐命名 | 说明 |
|---|---|---|---|
| 用户 | /users |
/getUser、/userList |
使用名词复数,避免动词 |
| 信用报告 | /credit-reports |
/creditReport、/getCreditReport |
多单词用连字符连接 |
| 评分记录 | /score-records |
/scoreRecord、/queryScore |
保持一致性,避免驼峰 |
| 查询授权 | /authorizations |
/auth、/checkAuth |
完整名词,避免缩写歧义 |
| 子资源 | /users/{id}/credit-reports |
/getUserCreditReport |
通过层级关系表达从属 |
最佳实践: 避免在URI中包含版本号以外的动词(如
/createUser),版本号建议放在URI前缀(如 /v1/users)或通过请求头传递。
3.3 HTTP方法选择
每个HTTP方法对应一种标准操作,在信用评分API中应严格遵循语义映射:
- GET — 查询资源,不改变服务端状态。例如:
GET /users/{id}/credit-reports获取用户信用报告。 - POST — 创建资源或触发操作。例如:
POST /score-records发起一次评分计算。 - PUT — 全量替换资源。例如:
PUT /users/{id}更新用户全部信息。 - PATCH — 部分更新资源。例如:
PATCH /authorizations/{id}更新授权状态。 - DELETE — 删除资源。例如:
DELETE /users/{id}/credit-reports/{reportId}删除指定报告。
3.4 状态码设计
状态码是API响应语义的重要组成部分,必须覆盖成功、客户端错误、服务端错误三大类。信用评分API推荐的状态码体系如下:
| 状态码 | 含义 | 信用评分场景示例 |
|---|---|---|
| 200 OK | 请求成功 | GET /users/{id} 返回用户信息 |
| 201 Created | 资源创建成功 | POST /score-records 返回新评分记录 |
| 204 No Content | 删除成功,无返回体 | DELETE /authorizations/{id} |
| 400 Bad Request | 请求参数错误 | 缺少必填字段、格式错误 |
| 401 Unauthorized | 未认证或认证失败 | API Key 无效或过期 |
| 403 Forbidden | 无权限访问资源 | 用户无权查询他人信用报告 |
| 404 Not Found | 资源不存在 | 查询不存在的用户ID |
| 409 Conflict | 资源冲突 | 重复创建已存在的授权记录 |
| 422 Unprocessable Entity | 业务逻辑校验失败 | 评分输入数据不满足风控规则 |
| 429 Too Many Requests | 请求频率超限 | 超出API调用配额 |
| 500 Internal Server Error | 服务端内部错误 | 评分引擎异常 |
| 503 Service Unavailable | 服务暂时不可用 | 系统维护或过载 |
注意: 避免滥用
200 OK 返回业务错误(如“评分失败”),应使用对应的4xx或5xx状态码,并在响应体中提供详细的错误码与错误描述。
3.5 响应体结构规范
统一的响应体结构有助于客户端解析与错误处理。信用评分API推荐以下标准格式:
// 成功响应示例
{
"code": 0,
"message": "success",
"data": {
"userId": "usr_20240301_001",
"creditScore": 725,
"reportId": "rpt_20240301_001"
},
"requestId": "req_abc123"
}
// 错误响应示例
{
"code": 40001,
"message": "参数校验失败",
"details": [
{
"field": "idNumber",
"error": "身份证号格式不正确"
}
],
"requestId": "req_def456"
}
响应体字段说明:
- code:业务状态码,0表示成功,非0表示具体错误类型。
- message:人类可读的状态描述。
- data:成功时的业务数据载体。
- details:错误详情数组,支持多字段校验错误。
- requestId:全局唯一请求标识,用于链路追踪与问题排查。
设计要点: HTTP状态码用于表示传输层与协议层的结果,业务状态码用于表示应用层的结果。两者配合使用,既满足RESTful规范,又支持细粒度的业务错误表达。