架构设计
接口规范与统一响应
统一前后端接口路径、HTTP 方法、响应壳、分页规范、幂等要求与鉴权边界。
这页解决什么问题
接口规范如果不统一,团队很快会出现这几种问题:
- 路径风格混乱,前端难以猜测接口语义
- 成功响应、错误响应、分页响应长得都不一样
- 前端只能对每个接口单独写适配逻辑
- 权限、审计、幂等要求散落在业务实现里
所以这页不是“代码格式癖好”,而是为了把接口作为前后端协作契约稳定下来。
API 路径规范
- 内部接口统一以
/api/v1/*为前缀 - 路径优先表达资源,而不是表达动作
- 路径使用小写和资源风格,不使用驼峰
示例:
/api/v1/auth/login/api/v1/system/users/api/v1/iam/roles/api/v1/files/upload/api/v1/audit/operate-logs
为什么这样约束
这样做的好处是:
- 前端服务层更容易按领域组织
- API 网关、代理、权限点、审计规则更容易按资源分类
- 后续如果某个领域拆分成独立服务,路由迁移成本更低
HTTP 方法规范
GET用于读取POST用于创建、复杂查询、提交任务PUT用于整体更新PATCH用于局部更新DELETE用于删除
复杂查询可以允许 POST /search 一类接口,但前提是语义清晰,并且不要把所有读取都偷懒写成 POST。
统一响应结构
推荐统一返回:
{
"httpStatus": 200,
"code": "A0000",
"message": "success",
"userMessage": null,
"data": {},
"requestId": "trace_xxx",
"path": "/api/example",
"timestamp": "2026-03-25 10:00:00"
}字段解释:
httpStatus:HTTP 状态码镜像,便于前端统一处理code:业务响应码message:面向排障的技术描述userMessage:面向最终用户展示的提示data:业务载荷requestId:链路追踪 IDpath:当前请求路径timestamp:响应时间戳
文件下载、流式响应可以例外,但依然要保留鉴权和审计约束。
HTTP 状态码与业务码
常用 HTTP 状态建议:
200:请求被正常处理400:参数错误401:未认证403:无权限404:资源不存在409:资源冲突429:限流500:系统异常503:服务不可用或降级
业务码建议分层:
A0000:成功B1xxx:认证与权限B2xxx:业务风控与配额B3xxx:参数与校验B4xxx:资源状态与冲突B5xxx:文件与导入导出B6xxx:限流、幂等、防刷Cxxxx:系统和依赖异常
请求头规范
建议统一支持:
AuthorizationX-Request-IdX-Client-TypeX-App-VersionAccept-Language
这些头的价值在于:
Authorization负责认证X-Request-Id贯穿排障链路X-Client-Type/X-App-Version方便兼容多端行为Accept-Language便于国际化响应或提示文案
分页规范
请求建议统一为:
{
"current": 1,
"pageSize": 20,
"sorter": {
"createdAt": "descend"
},
"filters": {
"status": [1],
"keyword": "admin"
}
}响应建议统一为:
{
"code": "A0000",
"message": "success",
"data": {
"list": [],
"total": 0,
"current": 1,
"pageSize": 20
}
}约束:
- 分页大小必须限制
- 禁止超大分页直接扫表
- 列表默认要带排序语义
- 高频列表要结合索引设计
写接口规范
- 创建用
POST - 整体更新用
PUT - 局部状态更新用
PATCH - 删除用
DELETE
导入导出、批量操作、状态切换这类动作,要么走资源语义清晰的路径,要么走明确的任务型接口,不要全部混成一个“万能 POST”。
参数校验规范
- 所有写接口必须做服务端校验
- 失败时返回统一业务码和可定位字段信息
- 不能依赖前端校验作为安全边界
前端校验负责交互体验,后端校验负责系统正确性。
幂等与防重复提交
以下动作要重点考虑幂等保护:
- 创建
- 审批
- 导入
- 导出
- 发送
- 状态切换
重复提交时应返回统一业务码,而不是直接抛通用异常或默默生成重复数据。
权限与数据范围
- 接口入口做功能权限校验
- 数据访问层做数据范围过滤
- 高风险操作写审计日志
这里最常见的误区是:前端按钮隐藏了,就以为接口也安全了。实际上后端接口必须独立完成真实鉴权。
文件与流式接口
- 上传统一
POST /api/v1/files/upload - 下载必须先鉴权、再审计、再输出流
- 私有文件建议使用签名或代理下载
如果是知识库、插件、导出报表等文件,更应该保留元数据和访问审计,不要直接裸链暴露。
导入导出与任务接口
导入导出尽量任务化,至少分成三类接口:
- 任务创建
- 任务状态查询
- 任务结果查询
大文件和复杂报表不要同步阻塞请求线程,这类场景更适合通过任务中心和异步链路承载。
开放接口预留
- 建议使用
/openapi/v1/* - 使用独立签名、时间戳、重放保护、限流和调用日志
- 内部接口和开放接口必须边界清晰
不要把内部后台接口直接暴露给第三方调用。
开发红线
- 不要让同一业务域同时存在多种响应壳
- 不要把所有读取都写成
POST - 不要省略
requestId - 不要把默认堆栈或数据库异常原样返回给前端
- 不要跳过权限、幂等和审计要求