前后端分离的核心矛盾:前端灵活多变的交互需求 vs 后端稳定、高性能、易维护的数据服务。高效 API 设计围绕「规范统一、性能最优、开发提效、可观测、易扩展」五大目标落地,下面分模块给出可直接落地的标准方案。
一、基础全局规范(统一标准,减少前后端沟通成本)
1. 接口分层与路由命名规范(RESTful 标准)
采用资源名词 + HTTP 方法,禁止用动词做路径,区分单资源 / 集合资源:
配套约束
版本强制管理:
/api/v1/前缀,迭代不兼容时升级 v2,旧版本保留兼容;资源名统一小写复数:users、orders、goods,禁止 userList、getUser;
子资源关联:
GET /api/v1/users/{uid}/orders查询用户名下订单;复杂查询、批量操作:用 POST,如批量删除
POST /api/v1/orders/batch-delete。
2. 统一全局返回体(前端一套解析逻辑)
固定结构,前端无需适配多种返回格式,区分业务码、HTTP 状态码、数据、分页、错误信息
// 成功返回
{
"code": 200, // 业务状态码
"msg": "操作成功",
"data": {}, // 核心业务数据,无数据时为null,不省略
"traceId": "1f34a567890abcdef" // 链路追踪ID,排查问题必备
}
// 分页列表标准结构(统一分页,前端通用分页组件)
{
"code": 200,
"msg": "查询成功",
"data": {
"records": [], // 当前页数据
"total": 120, // 总条数
"current": 1, // 当前页码
"size": 10, // 每页条数
"pages": 12 // 总页数
},
"traceId": "xxx"
}
// 错误返回
{
"code": 40001,
"msg": "手机号格式错误",
"data": null,
"traceId": "xxx"
}
状态码分层规则
HTTP 标准状态码(网关 /nginx 层面控制)
2xx:成功;4xx:客户端错误(参数、权限、未登录);5xx:服务端异常
自定义业务 code(业务细分,前端精准提示)
200:通用成功
40xxx:客户端错误:40001 参数错误、40101 未登录、40301 无权限
50xxx:服务端错误:50001 数据库异常、50002 第三方接口超时
3. 请求参数规范
GET 请求:所有参数放 Query,复杂筛选用多条件拼接,支持模糊、区间查询;
POST/PUT/PATCH:统一使用
application/json请求体,禁止 form-data 混用(文件上传单独接口);文件上传独立接口:
POST /api/v1/upload,Content-Type=multipart/form-data;参数命名统一:小驼峰
userName、phoneNumber,数据库下划线映射后端内部处理;必传参数强制校验,返回精准字段错误,如
msg: "userName不能为空"。
二、性能优化设计(核心:减少请求量、降低传输体积、缓存复用)
1. 批量接口,减少 HTTP 请求次数(前后端分离最大性能痛点)
前端频繁循环单条接口(列表循环查详情、批量操作)会造成请求爆炸,统一提供批量接口:
批量查询:
GET /api/v1/users?ids=1,2,3,4传入 id 数组,一次返回多条数据;批量新增 / 修改 / 删除:
POST /api/v1/orders/batch-save,body 传入数组;前端联查场景:接口支持关联查询,例如查询订单时携带用户信息,避免前端再调用户接口。
2. 字段过滤、按需返回,减小数据包体积
方案 1:动态字段筛选(Query 传 fields)
http
GET /api/v1/users/1?fields=id,userName,avatar
后端只返回指定字段,列表页不需要大文本、冗余字段时大幅减少传输大小。
方案 2:区分精简接口 / 详情接口
列表接口:只返回展示必要基础字段;
详情接口:返回完整扩展字段、富文本、附件信息。
3. 分页、排序、筛选标准化,避免全量查询
统一查询参数,前端封装通用查询组件:
http
GET /api/v1/orders?current=1&size=10&sort=createTime,desc&status=1&keyword=测试订单
sort:
字段,asc/desc,支持多字段排序逗号分隔;复杂多条件筛选全部放 query,后端统一处理,禁止前端全量拉取后本地筛选。
4. 多级缓存设计,降低数据库压力
浏览器缓存:GET 接口设置 Cache-Control、ETag、Last-Modified,静态字典、基础配置类接口开启强缓存;
网关缓存:Nginx 缓存不常变更的基础数据(字典、地区数据);
应用层 Redis 缓存:详情数据、高频查询列表,设置合理过期时间;
数据库缓存:索引优化、分库分表应对大数据量。
5. 压缩传输
Nginx 开启 gzip/br 压缩,JSON、接口响应自动压缩,传输体积降低 60%+。
三、开发协作提效设计(降低前后端对接成本)
1. 统一接口文档自动生成
后端集成 Swagger/Knife4j/OpenAPI3,代码注释自动生成文档,避免手动文档更新不同步:
每个接口标注入参、出参、业务说明、错误码;
前端直接根据 OpenAPI 文件自动生成 TS 类型、请求工具函数,完全不用手动写接口调用代码。
2. 统一鉴权方案
推荐 JWT Token 无状态鉴权,适配前后端分离无 Session 场景:
登录接口返回 accessToken+refreshToken;
所有需要登录接口 Header 携带:
Authorization: Bearer {token};token 过期用 refreshToken 无感刷新,前端统一拦截 401 跳转登录;
权限控制:接口内置角色 / 数据权限校验,返回 403 无权限,前端统一弹窗提示。
3. 错误统一拦截、全局异常处理
后端全局异常处理器,统一包装成标准返回体,禁止直接抛出原生异常堆栈给前端;
前端 Axios 统一拦截响应:
拦截 401 自动刷新 token、跳转登录;
拦截 403 弹窗无权限;
拦截 5xx 统一提示 “服务器异常,请稍后重试”;
业务错误码直接弹窗 msg 信息。
4. Mock 服务,前后端并行开发
基于 OpenAPI 文档生成 Mock 服务,后端接口未开发完成时,前端直接对接 Mock 数据,实现前后端并行开发,不互相阻塞。
四、扩展性与兼容性设计(避免后期重构)
1. 向前兼容原则
接口迭代禁止删除原有字段,只能新增可选字段;不兼容改动直接升级接口版本 v2,保障老版本前端正常运行。
2. 枚举 / 字典统一接口
所有下拉选择、状态枚举统一提供字典接口:GET /api/v1/dict/{dictCode},前端全局缓存,避免每个页面单独写枚举映射。
3. 大文件、大数据流处理方案
超大列表导出:提供异步导出接口,任务提交后轮询下载链接,避免接口超时;
大文件上传:分片上传接口,支持断点续传;
海量数据查询:禁止一次性返回万条以上,强制分页或导出任务。
五、可观测与运维设计(快速定位接口问题)
全局 traceId:每个请求生成唯一链路 ID,日志、返回体、异常都携带,前后端联调、线上故障一键检索全链路日志;
接口埋点监控:统计 QPS、响应耗时、错误率,慢接口告警优化;
请求日志记录:记录入参、出参、耗时,脱敏手机号、身份证等敏感信息。
六、前端适配配套规范(和后端 API 配套,最大化效率)
统一封装 Axios 请求工具,自动携带 token、统一解析返回体、全局错误拦截;
根据 OpenAPI 自动生成 TS 类型,接口入参出参强类型约束,减少线上参数错误;
页面缓存策略:列表数据本地短时缓存,避免重复请求;
复杂联动场景后端统一聚合数据,不把多接口拼接逻辑放在前端。
七、避坑总结(低效 API 常见问题)
❌ 动词路由
/getUser/deleteOrder→ ✅ RESTful 资源路由;❌ 一个页面调用 5~10 个独立接口 → ✅ 批量查询、聚合接口;
❌ 接口返回全量数据库字段 → ✅ 按需字段筛选;
❌ 无版本管理,迭代直接修改旧接口 → ✅ /api/v1 版本隔离;
❌ 多种返回格式、不统一错误码 → ✅ 全局标准化返回体;
❌ 大量循环单条接口查询详情 → ✅ ids 批量查询。