# 接口一致性检查规范(code-audit) ## 一、背景与目标 本项目为多端共用后端架构,多个前端调用同一套后端接口。修改代码时若只为 A 端调整接口(参数、返回结构、校验规则、权限等),容易把同调用的 B 端改坏。 本规范定义「接口一致性检查」的触发条件、检查项、执行流程与产出要求。 - 端(调用方)清单不固定枚举,以 `./project-structure.md` 当时登记的目录为准 - 网关前缀口径见 `./java-code-review.md` 第 2 条:管理端 `/api`,面客端 `/c-api` 核心原则:**改接口先找全调用方,破坏性变更必须全端适配。** ## 二、触发条件 出现以下任一情形即执行本检查: 1. 后端新增/修改/删除 Controller 接口(路径、入参 DTO、返回 VO、校验注解、权限注解、错误码) 2. 修改被多个接口引用的公共 DTO / VO / 枚举 / Service(按字段与方法引用搜索确认影响面) 3. 某一端前端修改了公共请求封装(request 拦截器、api 聚合层、公共组件内的接口调用) 4. 代码审查例行扫描时,对本次 diff 涉及的接口做调用方清点 仅 A 端独占的接口(确认无第二调用方)可简化为只核对 A 端自身适配,矩阵仍需留档。 ## 三、检查前准备 1. 更新主分支代码(主分支为 development 或 dev,同代码审查流程) 2. 自建接口清单:**不假定存在现成的接口清单或提取脚本,每次检查时从源码现场生成**: - 后端侧:扫描 `./project-structure.md` 登记的后端目录全部 Controller,提取类级 + 方法级映射注解(`@RequestMapping` / `@PostMapping` 等),得到「路径、入参 DTO、返回 VO」清单 - 前端侧:扫描各端源码的 api 封装层与请求调用点,提取「请求 URL、传参、响应字段读取点」 - 交叉验证:前端调用 URL 集合与后端映射集合双向比对,悬空项(有调无实现 / 有实现无调用)单列 3. 调用方定位方法: - 后端 → 前端:按后端映射路径(换算网关前缀差异)在前端各端源码搜索 URL 片段与关键参数名 - 前端 → 后端:从前端 api 封装层提取 URL + 入参,与后端接口清单比对 - 后端 → 后端:搜索 Feign Client / RestTemplate / WebClient 的服务间调用 4. 路径匹配注意:区分 `/api` 与 `/c-api` 网关前缀;`/client/` 段归属判定见 `./java-code-review.md` 第 2 条 ## 四、检查项 ### 4.1 调用方清点(必做,先行) 对每个变更接口建立「调用方矩阵」: - **行** = 变更接口 - **列** = 调用方:按 `./project-structure.md` 当时登记的前端目录逐一生成,不写死端列表(新增/下线端以该文件更新为准),末尾固定追加「后端内部」「第三方」两列 示例(列名以检查时 `./project-structure.md` 登记为准): | 变更接口 | \<前端目录A\> | \<前端目录B\> | … | 后端内部 | 第三方 | |---|---|---|---|---|---| | POST /api/xxx/yyy | 调用(3处) | 不涉及 | … | 未调用 | 未调用 | | POST /api/zzz(破坏性变更) | 已适配(同批提交 abc123) | 未适配 | … | 未调用 | 无法确认(检索方式:…) | - 标记口径(统一使用文字,禁止使用 ✓/✗/— 等符号): - `调用(n处)` — 该方调用此接口,附调用点数量 - `已适配` — 调用方已与本次变更同批适配(附 file:line 或提交号) - `未适配` — 调用方未同步适配本次破坏性变更(计问题) - `未调用` — 经源码检索确认该方无调用点 - `不涉及` — 该方无此业务场景,功能上不可能调用(如该端无对应业务模块) - `无法确认` — 复核后仍无法确认 - **「无法确认」不得静默放过**:以 URL 最后两段路径 + 关键参数名全局复核;仍无结果的注明检索方式后按「未调用」处理 - 「调用 / 已适配 / 未适配」格子须落到具体调用点(file:line),作为后续逐格核对的依据 ### 4.2 一致性核对项(对矩阵中每个「调用 / 已适配 / 未适配」格子逐项执行) **C1 路径一致性** - 前端请求 URL 与后端当前映射一致;接口改名/迁移后,其余端的旧路径残留即为断链 **C2 请求参数一致性** - 前端传的每个字段后端仍在接收(改名/删除字段时逐端核对) - 后端新增必填参数 → 所有调用方必须已适配,否则报问题 - 校验规则收紧(`@NotNull` / `@Size` / 正则)→ 核对各端既有数据及**已发布未强更的旧版 APP** 是否触发拒绝 **C3 响应结构一致性** - 前端读取的每个字段(含 `data.xxx` 嵌套取值)后端仍在返回 - 字段改名/删除/类型变化 → 列出所有读取该字段的调用点 - 后端新增枚举值/字典项 → 各端前端是否有兜底(default 分支、未匹配文案) - 统一返回结构 `{ code, message, data }` 未被破坏 **C4 语义与行为一致性** - 分页参数语义(page/size、每页上限 1000)、排序白名单 - 日期/时区格式、金额单位(分/元)、ID 类型(string/number 精度) - 权限调整:接口加权限注解后,原先可调用的其他端是否会 403 - 幂等 / 防重复提交约束变化对多端的影响 **C5 后端内部共用逻辑(后端改动自查)** - 公共 DTO/VO 字段变更 → 搜索所有 `@RequestBody` 与返回该类型的 Controller,逐一核对 - 公共 Service/Mapper 逻辑变更 → 列出全部调用方 Controller,逐一评估行为变化 - 差异化需求:确需不同行为的,拆独立接口或加版本参数;**禁止在同一共享接口内按请求来源写 if 分支** ### 4.3 变更分类与判定 | 分类 | 判定 | 处理 | |---|---|---| | 非破坏性 | 仅新增可选字段/新增接口,不影响既有调用方 | 放行,矩阵留档 | | 破坏性已适配 | 所有调用方在同一提交/同一批次内完成适配 | 放行,矩阵留档 | | 破坏性未适配 | 存在调用方未同步适配 | **计违规/整改**,标注受影响端与现象 | | 调用方悬空 | 前端调用了后端不存在的接口(或后端接口无任何前端调用) | 计违规/整改 | ## 五、执行流程 1. 由 diff 识别变更接口清单(后端 Controller 级 + 公共 DTO 级 + 前端封装层) 2. 生成调用方矩阵(4.1) 3. 逐格执行 C1–C4,后端改动补 C5 4. 按 4.3 分类判定 5. 按第六节产出报告 ## 六、产出要求 - 报告文件:`./代码审查-[年-月-日-时]-一致性检查.md`(独立成文,或作为代码审查报告章节并注明覆盖范围) - 必含内容: 1. 变更接口清单 2. 调用方矩阵(含调用点 file:line) 3. 问题明细,每条含:检查项编号(C1–C5)、位置、受影响端、现象、修复建议、严重度 4. 分类判定汇总与结论 - 严重度对齐代码审查报告口径:**严重**(其他端功能不可用/报错)、**一般**(兼容但口径不一致)、**提示**(风险与建议) - 问题标注样式:报告内所有**计违规/整改**的内容——问题明细标题、矩阵「未适配」格子、判定汇总计整改行、不合格结论、待整改项——一律用加粗红字 `**…**` 标注;放行留档项不得标红 - 中间数据(矩阵原始数据、搜索结果、脚本)统一放 `./scan-data/`,脚本可直接复跑,不要另建目录 - 豁免项按 `./CLAUDE.md` 豁免清单处理,不重复上报 ## 七、速查清单(执行时逐项打勾) - [ ] 已更新主分支并完成接口清单自建(后端映射 + 前端调用点 + 交叉验证) - [ ] 每个变更接口已完成调用方清点,无「无法确认」遗留 - [ ] C1 路径 / C2 请求 / C3 响应 / C4 语义 已逐格核对 - [ ] 公共 DTO / Service / 枚举 变更已排查全部使用方(C5) - [ ] 破坏性变更全部「已适配」或已列入整改 - [ ] 差异化需求已给出拆分接口 / 版本化建议 - [ ] 报告与中间数据已落盘到约定位置