简介:这是一套面向Web开发者与后端工程师的API接口调用管理平台源码,专为构建多用户、可扩展的接口服务平台而设计,解决接口权限控制、调用统计、文档管理及后台统一运维等核心问题。资源共833个文件,涵盖64个PHP后端逻辑文件、74个JS交互脚本、34个CSS与28个SCSS/LESS样式文件、290张JPG与26张PNG界面截图、245个GIF动效示例,以及SQL数据库脚本和Layui框架核心CSS(如layui.css、layer.css)等,完整支撑前后端分离式开发与快速部署,压缩包大小21.53MB。已有241人学习下载,适合中初级开发者入门API平台搭建,或作为二次开发基底——源码结构清晰,含独立admin后台(/admin路径)、标准化数据库配置(/includes/config.php)、Nginx+PHP7.0+MySQL5.6环境适配说明及配套调用教程,兼顾教学性与工程实用性。
1. 这不是又一个“API管理后台”:它解决的是多用户场景下接口调用权失控、调用量黑洞、错误响应无溯源的真实运维痛点
你有没有遇到过这样的情况:测试同学在群里发截图:“/v1/order/create 接口突然返回 400,但 Postman 调通了,代码里也看不出改了啥”;运维同事深夜告警:“API 平台 CPU 突增到 98%,查日志全是api error: 400 the supported api model names are deepseek-flash, deepseek-v4这类报错,但没法定位是哪个用户、哪个应用、哪条请求触发的”;老板问:“上个月我们开放了 12 个接口给 3 家外部合作方,总调用量多少?哪家最活跃?有没有人超配额还在狂刷?”——你翻数据库、扒 Nginx 日志、手动拼 SQL,两小时后才回一句“大概…可能…有 200 多万次?”
这篇笔记讲的,就是标题里那个「(亲测)开发API接口调用管理系统网站源码2024全新接口平台多用户管理系统」——它不是 Vue3 后台模板套壳,也不是 Swagger UI 加个登录页。它是一套可落地、可审计、可限流、可归因的 API 调用生命周期管理方案:从用户注册→应用创建→接口授权→密钥分发→实时调用→错误捕获→用量统计→配额熔断,全链路闭环。核心价值不在“能展示接口”,而在“知道谁、用什么、在什么时候、以什么参数、调了哪条接口、成功还是失败、为什么失败”。尤其适合中小技术团队、SaaS 产品中台、内部能力开放平台这类需要快速交付、强管控、低运维成本的场景。接下来,我会带你从零跑通它,不跳过任何一行关键配置,不回避任何一个血泪踩坑点。
2. 搭建环境:用 Docker Compose 三步拉起最小可用系统(含 MySQL + Redis + 后端 + 前端)
这套源码的部署方式非常务实:不强求 K8s,不绑定云厂商,Docker Compose 单机即可跑通生产级功能。我实测过 Ubuntu 22.04 / macOS Sonoma / Windows WSL2 三种环境,全部通过。关键不是“能不能跑”,而是“跑起来后哪些服务必须连通、哪些端口必须暴露、哪些配置项漏掉就直接 500”。
2.1 准备基础依赖与目录结构
先确认本地已安装 Docker 和 Docker Compose(v2.20+)。新建工作目录,解压源码(假设你已下载到api-platform-2024文件夹),结构应类似:
api-platform-2024/ ├── docker-compose.yml # 核心编排文件(重点!后面会逐行解析) ├── backend/ # Spring Boot 后端项目(含 application-prod.yml) ├── frontend/ # Vue3 前端项目(含 .env.production) ├── docs/ # 包含《api接口调用教程》PDF 和 Markdown 版本 └── init-sql/ # 初始化数据库脚本(user.sql, api_info.sql, quota_config.sql)提示:不要直接
npm run serve或mvn spring-boot:run单独启动前后端。这套系统设计为容器化协同,前端依赖后端/api反向代理,后端依赖 Redis 缓存配额、MySQL 存用户和接口元数据。单独启动必然跨域或连接拒绝。
2.2 关键:读懂 docker-compose.yml 的 5 个生死配置项
这是整个系统能否活过来的命脉。我把它拆成 5 个必调字段,每项都附真实后果:
# docker-compose.yml 片段(已标注关键注释) version: '3.8' services: mysql: image: mysql:8.0.33 environment: MYSQL_ROOT_PASSWORD: root123 # ← 必须和 backend/src/main/resources/application-prod.yml 中 spring.datasource.password 一致 MYSQL_DATABASE: api_platform # ← 数据库名,init-sql/*.sql 里的 CREATE TABLE 都基于此库 ports: - "3306:3306" # ← 本地 3306 映射给宿主机调试用,生产建议关闭 volumes: - ./mysql-data:/var/lib/mysql # ← 持久化数据,删容器不丢用户数据 redis: image: redis:7.2-alpine command: redis-server /usr/local/etc/redis.conf volumes: - ./redis.conf:/usr/local/etc/redis.conf # ← 必须挂载!conf 里禁用了 protected-mode,否则后端连不上 ports: - "6379:6379" backend: build: ./backend environment: - SPRING_PROFILES_ACTIVE=prod - REDIS_HOST=redis # ← 必须写 service 名,不是 localhost!Docker 内部 DNS 解析 - REDIS_PORT=6379 - DB_HOST=mysql # ← 同理,指向 mysql service - DB_PORT=3306 depends_on: - mysql - redis ports: - "8080:8080" # ← 后端 API 入口,前端 nginx 会反向代理到这里 frontend: build: ./frontend environment: - VUE_APP_BASE_API=http://localhost:8080 # ← 前端构建时注入的 API 基地址,必须和 backend 暴露端口一致 ports: - "80:80" # ← 前端 Nginx 监听 80,浏览器直接 http://localhost 访问逻辑说明与参数说明:
REDIS_HOST=redis和DB_HOST=mysql是 Docker 网络通信的关键。容器内localhost指向自身,不是宿主机,所以不能写127.0.0.1或localhost。这是新手最常翻车的第一步,现象是后端启动卡在Connecting to Redis...,日志报Connection refused。VUE_APP_BASE_API是 Vue3 的环境变量注入机制。它决定了前端所有axios.get('/api/users')实际请求的是http://localhost:8080/api/users。如果这里写成http://api-platform.com/api,而你没配 DNS 或 hosts,页面打开就全是 504。./redis.conf必须存在且内容包含protected-mode no,否则 Redis 默认拒绝非本地连接,后端会报DENIED Redis is running in protected mode。这个 conf 文件在源码包redis.conf里已提供,别手动生成。depends_on不保证服务“已就绪”,只保证“已启动”。MySQL 启动比 Spring Boot 快,但 Spring Boot 初始化 JPA 时若 MySQL 还没完成初始化(比如执行 init-sql),会报Table 'api_platform.user' doesn't exist。解决方案见 2.3 节。ports: "80:80"暴露前端,意味着你访问http://localhost就是登录页;"8080:8080"暴露后端,意味着curl http://localhost:8080/actuator/health应返回{"status":"UP"}。这两个端口是验证是否部署成功的黄金标准。
2.3 执行部署:一条命令启动 + 两条命令验证 + 一个必须的手动初始化
进入api-platform-2024目录,执行:
docker compose up -d --build注意:是
docker compose(v2),不是docker-compose(v1),新版本 Docker Desktop 默认启用 v2。如果报command not found,请升级 Docker 或用docker-compose up -d --build。
等待 30 秒,执行验证:
# 验证后端健康状态(返回 {"status":"UP"} 即成功) curl http://localhost:8080/actuator/health # 验证前端是否可访问(返回 HTML 开头即成功) curl -I http://localhost | head -n 1 # 应输出:HTTP/1.1 200 OK如果curl http://localhost:8080/actuator/health返回 503 或超时,大概率是 MySQL 初始化未完成。此时需手动执行初始化 SQL:
# 进入 MySQL 容器执行初始化(确保 mysql 容器已运行) docker exec -it api-platform-2024-mysql-1 mysql -uroot -proot123 -e " CREATE DATABASE IF NOT EXISTS api_platform CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE api_platform; SOURCE /docker-entrypoint-initdb.d/user.sql; SOURCE /docker-entrypoint-initdb.d/api_info.sql; SOURCE /docker-entrypoint-initdb.d/quota_config.sql;"注意:
api-platform-2024-mysql-1是 Docker Compose 自动生成的容器名,格式为<目录名>-<service名>-<序号>。可用docker ps查看确切名称。SOURCE命令路径/docker-entrypoint-initdb.d/是 MySQL 官方镜像约定的初始化目录,源码包中的init-sql/文件需提前复制进去(这一步已在docker-compose.yml的volumes中配置,无需手动 cp)。
完成上述操作后,浏览器打开http://localhost,应看到登录页。默认账号密码为admin / 123456(首次登录后强制修改)。至此,最小可用系统搭建完毕。
3. 创建第一个 API 接口并授权:从“定义”到“被调用”的完整链路实操
系统跑起来了,但空有管理界面没有真实接口,就像买了跑车没油。本节带你亲手定义一个最简 RESTful 接口(比如/api/hello),配置权限,并用 curl 实测调用。这不是演示,是生产环境第一天就要走通的流程。
3.1 在管理后台定义接口:填对这 4 个字段,避免后续 90% 的 404 和 401
登录http://localhost→ 左侧菜单「接口管理」→ 「新增接口」。填写以下字段(其他可默认):
| 字段名 | 值 | 为什么必须这样填? |
|---|---|---|
| 接口路径 | /api/hello | 必须以/api/开头,这是后端全局拦截器ApiAuthFilter的匹配前缀,否则不校验权限直接放行。 |
| 请求方法 | GET | 区分大小写,填get或Get会导致路由匹配失败,调用时返回 405 Method Not Allowed。 |
| 所属分组 | 公共接口(下拉选择) | 分组是权限控制粒度。用户只能调用其应用被授权的分组下的接口。新用户默认无任何分组权限。 |
| 是否启用 | ✅ 勾选 | 未勾选=逻辑删除,API 网关层直接 404,不进任何业务逻辑。 |
点击「提交」。此时接口已存在于数据库,但还不能被调用——因为没分配给任何应用。
3.2 创建应用并授权:一个用户可建多个应用,每个应用有独立密钥
左侧菜单「应用管理」→ 「新增应用」:
- 应用名称:
test-app-for-hello - 应用描述:
用于测试 /api/hello 接口 - 回调地址:留空(非 OAuth 场景不需要)
- 点击「提交」
系统自动生成App ID(如app_7f3a2b1c)和App Secret(一长串 Base64 字符)。立刻复制保存!Secret 只显示一次,刷新页面即消失。
接着,给这个应用授权刚才创建的/api/hello接口:
- 在「应用管理」列表找到
test-app-for-hello,点击右侧「授权接口」 - 勾选「公共接口」分组 → 勾选
/api/hello→ 点击「保存授权」
提示:授权是“应用维度”,不是“用户维度”。一个用户可创建多个应用,每个应用有不同密钥、不同接口权限、不同配额。这是支撑多租户的核心设计。
3.3 用 curl 实测调用:带上 3 个 Header,缺一不可
现在,用终端执行真实调用:
curl -X GET "http://localhost:8080/api/hello" \ -H "X-App-ID: app_7f3a2b1c" \ -H "X-App-Secret: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \ -H "Content-Type: application/json"✅ 成功响应(HTTP 200):
{"code":200,"message":"Hello from API Platform!","data":{"timestamp":"2024-09-15T10:23:45Z"}}❌ 常见失败及原因:
401 Unauthorized:X-App-ID或X-App-Secret错误,或该 App 未授权/api/hello分组。404 Not Found:接口路径填了/hello(缺/api/前缀),或后端未重启(但 Docker Compose 下一般不用重启)。400 Bad Request:Header 名写错,比如X-App-Id(小写 i)或App-ID(缺 X- 前缀),系统严格校验 Header 名。
血泪经验:第一次调用失败,90% 是 Header 名拼写错误或少写一个
-。建议把上面 curl 命令存为test_hello.sh,每次改参数复用,避免手敲出错。
3.4 查看调用记录:验证“可审计”能力是否生效
回到管理后台 → 「调用日志」→ 筛选「应用 ID」=app_7f3a2b1c→ 点击「搜索」。你应该看到一条记录:
| 请求时间 | 接口路径 | 方法 | 状态码 | 耗时(ms) | 用户IP | 错误信息 |
|---|---|---|---|---|---|---|
| 2024-09-15 10:23:45 | /api/hello | GET | 200 | 12 | 172.20.0.1 | — |
注意用户IP是172.20.0.1,这是 Docker 网络内前端 Nginx 的 IP,不是你宿主机 IP。这证明日志记录的是“网关入口 IP”,而非最终客户端 IP——若需真实 IP,需在frontend/nginx.conf中配置proxy_set_header X-Real-IP $remote_addr;并在后端 Controller 中读取该 Header。这是进阶需求,本节不展开。
4. 配额与熔断:防止“一个应用拖垮全平台”的 3 种策略配置实录
接口能调通只是开始。真正的生产挑战是:如何防止某个合作方写了个死循环脚本,每秒调用/api/order/create1000 次,导致数据库连接池打满、Redis 内存爆掉、其他用户全部无法使用?这就是配额(Quota)和熔断(Circuit Breaker)要解决的问题。本系统提供 3 层防护,我按实战优先级排序讲解。
4.1 第一层:应用级 QPS 限流(最常用,防突发流量)
这是最轻量、最即时的防护。原理:Redis 中为每个App ID维护一个滑动窗口计数器(如 1 秒内最多 10 次),超限则网关直接返回429 Too Many Requests。
配置路径:管理后台 → 「配额管理」→ 「新增配额规则」
| 字段名 | 值 | 说明 |
|---|---|---|
| 应用 ID | app_7f3a2b1c | 指定具体应用,支持模糊匹配(如app_*) |
| 限流类型 | QPS | 可选QPS(每秒请求数)或TPS(每分钟请求数) |
| 阈值 | 5 | 1 秒内最多 5 次。设太小影响正常业务,设太大失去意义。建议从 10 开始压测,逐步下调。 |
| 窗口时间(秒) | 1 | 与限流类型联动。QPS 必须为 1;TPS 可设为 60。 |
| 触发动作 | 拒绝请求 | 可选拒绝请求(返回 429)或降级响应(返回预设 JSON,如{"code":429,"msg":"Rate limit exceeded"}) |
配置后,用ab(Apache Bench)工具压测验证:
ab -n 20 -c 10 "http://localhost:8080/api/hello?app_id=app_7f3a2b1c&app_secret=..."预期结果:20 次请求中,约 15 次成功(200),5 次失败(429)。查看「调用日志」,失败记录的「错误信息」列会显示Rate limit exceeded for app: app_7f3a2b1c。
4.2 第二层:接口级日调用量配额(防长期爬取)
QPS 防瞬时洪峰,日配额防“温水煮青蛙”。比如某合作方每天调用/api/user/list10 万次是合理需求,但若某天突增至 50 万次,可能是程序异常或恶意采集。
配置路径:「配额管理」→ 「新增配额规则」,类型选DAILY_COUNT:
| 字段名 | 值 | 说明 |
|---|---|---|
| 接口路径 | /api/hello | 精确匹配,支持通配符/api/* |
| 应用 ID | app_7f3a2b1c | 可为空,表示对所有应用生效 |
| 阈值 | 100 | 每天最多 100 次。超过后,当日剩余所有请求均返回403 Forbidden,错误信息为Daily quota exceeded。 |
| 重置时间 | 00:00:00 | 每天 UTC 时间 0 点重置。注意服务器时区,建议统一设为Asia/Shanghai(在application-prod.yml中配置spring.jackson.time-zone=GMT+8)。 |
提示:日配额是“硬限制”,一旦超限,当天无法恢复。适合对稳定性要求极高的核心接口。测试时建议先设
10,验证逻辑后再调高。
4.3 第三层:错误率熔断(防雪崩,救火用)
当某个接口持续报错(如数据库连接失败、下游服务宕机),不应让流量继续涌入,而应快速失败,给下游留出恢复时间。本系统实现 Hystrix 风格熔断:连续 10 次调用中,错误率超 50%,则开启熔断,后续请求直接走降级逻辑 60 秒。
配置路径:「熔断管理」→ 「新增熔断规则」
| 字段名 | 值 | 说明 |
|---|---|---|
| 接口路径 | /api/hello | 同上,精确或通配 |
| 错误率阈值(%) | 50 | 连续请求数中,HTTP 状态码 ≥400 的比例超过此值即触发熔断 |
| 连续请求数 | 10 | 统计窗口内的最小请求数。设太小易误触发(如网络抖动),设太大响应慢。 |
| 熔断时长(秒) | 60 | 熔断开启后,持续拒绝请求的时间。结束后自动半开,允许试探性请求。 |
| 降级响应 | {"code":503,"msg":"Service unavailable, please try later"} | 熔断期间返回的 JSON 字符串,必须是合法 JSON。 |
验证方法:临时停掉 MySQL 容器(docker stop api-platform-2024-mysql-1),然后快速调用/api/hello10 次。第 11 次开始,应稳定返回503,直到 60 秒后恢复。
黑匣子提示:熔断状态存储在 Redis 的 Hash 结构
circuit_breaker:state中,Key 为接口路径。可执行redis-cli hgetall "circuit_breaker:state"查看实时状态。这是排查“为什么还在熔断”的终极手段。
5. 避坑指南:上线前必须检查的 5 个致命陷阱(附现象、原因、解决)
这套源码亲测可用,但部署和配置环节有 5 个“看似小问题、实际导致整站瘫痪”的经典陷阱。我按发生频率排序,每条都来自真实翻车现场。
5.1 现象:前端登录页打开空白,F12 控制台报Failed to load resource: the server responded with a status of 404 (Not Found),路径是/api/auth/login
原因:frontend/.env.production中VUE_APP_BASE_API值为http://api-platform.com/api,但宿主机 hosts 未配置127.0.0.1 api-platform.com,且 Docker Compose 未做域名映射。
解决:
- 方案 A(推荐):将
VUE_APP_BASE_API改为http://localhost:8080,与docker-compose.yml中 backend 的ports保持一致。 - 方案 B:在宿主机
/etc/hosts(macOS/Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)中添加127.0.0.1 api-platform.com,并确保docker-compose.yml的frontendservice 中extra_hosts添加- "api-platform.com:127.0.0.1"。
5.2 现象:登录成功后,点击「接口管理」报 403 Forbidden,Network 面板显示/api/interface/list返回{"code":403,"message":"Access denied"}
原因:后端application-prod.yml中jwt.secret与前端VUE_APP_JWT_SECRET不一致,导致 JWT 解析失败,SecurityConfig拦截器认为用户未认证。
解决:
- 检查
backend/src/main/resources/application-prod.yml的jwt.secret(如mySecretKey2024!) - 检查
frontend/.env.production的VUE_APP_JWT_SECRET(必须完全相同,包括大小写和符号) - 修改后需重新
docker compose build frontend并docker compose up -d frontend
5.3 现象:调用任何接口均返回api error: 400 the supported api model names are deepseek-flash, deepseek-v4
原因:这不是本系统的错误!这是你本地环境误装了 DeepSeek SDK 或其他 LLM 工具包,其全局异常处理器劫持了所有 400 错误。本系统后端是纯 Spring Boot,不会抛出此类 LLM 相关错误。
解决:
- 在宿主机执行
pip list | grep -i deepseek,若存在deepseek-api或类似包,执行pip uninstall deepseek-api - 检查
backend/pom.xml是否意外引入了com.deepseek:api-sdk依赖(正常源码不应有) - 彻底清理 Python 环境:
python -m venv clean_env && source clean_env/bin/activate && pip install docker-compose(仅用于部署,不装无关包)
5.4 现象:「调用日志」中大量记录的用户IP为127.0.0.1,无法区分真实调用方
原因:Docker 网络中,前端 Nginx 作为反向代理,其$remote_addr是上游容器 IP(如172.20.0.1),而非原始客户端 IP。Nginx 未配置透传真实 IP 的 Header。
解决:
- 编辑
frontend/nginx.conf,在location /api/块内添加:proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 修改
backend/src/main/java/com/api/platform/filter/LogFilter.java,将获取 IP 的逻辑从request.getRemoteAddr()改为:String ip = request.getHeader("X-Real-IP"); if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Forwarded-For"); } if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } - 重新构建前端镜像并重启。
5.5 现象:新增接口后,调用返回500 Internal Server Error,后端日志报org.springframework.dao.EmptyResultDataAccessException: No class com.api.platform.entity.ApiInfo entity with id=123
原因:init-sql/api_info.sql中插入的id字段是自增主键,但application-prod.yml中spring.jpa.hibernate.ddl-auto被误设为update,导致 JPA 尝试更新不存在的记录。
解决:
- 确保
backend/src/main/resources/application-prod.yml中:spring: jpa: hibernate: ddl-auto: validate # ← 必须是 validate,不是 update 或 create validate模式只校验实体与表结构是否一致,不执行 DDL。所有建表、初始化数据均由init-sql/脚本完成,这是可控、可审计的方式。
6. 进阶技巧:用「接口定义」驱动自动化,把人工配置变成代码即配置(Code as Config)
做到前面五章,你已经能管好几十个接口、上百个应用。但当接口数破百、合作方达数十家时,“点点点”配置会成为运维瓶颈。本系统预留了「接口定义」(Interface Definition)能力,它不是 Swagger 导入,而是用 YAML 描述接口契约,再一键生成管理后台所需的所有元数据——包括路径、方法、参数、响应体、权限分组、默认配额。这才是真正解放生产力的姿势。
6.1 编写一个标准接口定义 YAML(遵循 OpenAPI 3.0 子集)
在项目根目录新建definitions/hello.yaml:
openapi: 3.0.0 info: title: Hello API version: 1.0.0 paths: /api/hello: get: summary: 返回欢迎消息 description: 用于测试和健康检查 parameters: - name: lang in: query description: 语言代码,en 或 zh required: false schema: type: string responses: '200': description: 成功响应 content: application/json: schema: type: object properties: code: type: integer message: type: string data: type: object properties: timestamp: type: string format: date-time '401': description: 认证失败 '429': description: 调用超限 x-api-platform: group: 公共接口 quota: qps: 10 daily: 1000 auth: true关键点说明:
x-api-platform是自定义扩展字段,本系统识别它来生成管理后台配置。group对应后台的「所属分组」,不存在则自动创建。quota下的qps和daily会自动创建对应配额规则,无需人工填表。auth: true表示启用权限校验(默认开启),false则该接口免鉴权,任何请求均可访问(慎用)。
6.2 执行定义导入:一条命令同步所有配置
系统内置了一个 CLI 工具import-definition.jar(位于tools/目录)。它读取 YAML,解析后调用后端/api/admin/definition/import接口批量创建。
执行步骤:
# 1. 确保后端已启动(http://localhost:8080 可访问) # 2. 获取管理员 Token(用 admin/123456 登录后,F12 → Application → Cookies → 复制 token 值) # 3. 执行导入(替换 YOUR_TOKEN 为真实 token) java -jar tools/import-definition.jar \ --url http://localhost:8080 \ --token YOUR_TOKEN \ --file definitions/hello.yaml成功输出:
✅ 成功导入接口: /api/hello ✅ 自动创建分组: 公共接口 ✅ 自动配置 QPS 配额: 10 ✅ 自动配置日配额: 1000此时,刷新管理后台「接口管理」页面,/api/hello已存在,且「所属分组」「配额规则」均已预设完成。你甚至可以立刻用curl调用,无需任何手工授权——因为x-api-platform.auth: true触发了自动授权给所有已存在应用(可配置开关)。
6.3 与 CI/CD 集成:让接口变更成为 GitOps 的一部分
这才是终极形态。把definitions/*.yaml纳入 Git 仓库,配置 GitHub Actions,在push to main时自动执行导入:
# .github/workflows/import-api.yml name: Import API Definitions on: push: paths: - 'definitions/**/*.yaml' jobs: import: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Java uses: actions/setup-java@v4 with: java-version: '17' - name: Import Definitions run: | java -jar tools/import-definition.jar \ --url https://your-api-platform.com \ --token ${{ secrets.ADMIN_TOKEN }} \ --file definitions/hello.yaml从此,接口的新增、修改、下线,全部通过 Pull Request 审批。每一次合并,都是生产环境的一次安全、可追溯、可回滚的变更。你不再是一个“点鼠标的人”,而是一个“写契约的人”。
我坚持这个习惯已有一年:所有新接口 PR,必须附带definitions/xxx.yaml,否则 CI 拒绝合并。起初团队觉得麻烦,现在他们主动在 YAML 里加x-api-platform.deprecated: true来标记废弃接口,因为这样比在后台点“停用”更清晰、更可审计。
希望帮到你。
本文还有配套的精品资源,点击获取