中转系统接口文档自动生成,OpenAPI/Swagger输出
对于部署了 API 中转服务(如 one-api、new-api 或自研网关)的团队来说,接口文档长期靠手工维护很容易和实际接口脱节。
正确做法是让中转系统直接输出 OpenAPI/Swagger 规范文档,前端、测试和调用方都能拿到统一接口说明。
本文会从准备条件开始,带你把文档自动生成链路完整跑通,并给出验证和避坑方法。
开始前需要确认哪些条件
先确认你的中转系统是否已经内置 OpenAPI 支持。
大部分基于 Gin、FastAPI、Spring Boot 构建的中转程序,都自带 Swagger UI 或 OpenAPI JSON 输出接口,只是默认关闭。
至少准备好三样东西:
- 一台已部署中转系统的服务器,能通过命令行操作;
- 中转服务源码或可修改的配置文件(如果是容器部署,需要挂载配置);
- 一个能访问服务端口的域名或 IP,用于后续验证文档页面。
以常见的 new-api 项目为例,它依赖 Go 的 swaggo 工具生成文档,服务启动后访问 /swagger/index.html 即可看到界面。
如果是自己写的 FastAPI 服务,框架自带 /docs 和 /openapi.json,连额外配置都不需要。
自动生成 OpenAPI/Swagger 文档的两种主流方式
第一种:使用框架自带文档生成器。 这种方式适合新项目或代码结构简单的服务。
以 FastAPI 为例,在入口文件里已经默认注册了路由:
from fastapi import FastAPI
app = FastAPI(title="中转系统 API", version="1.0.0")
@app.get("/v1/models")
def list_models():
return {"data": ["gpt-4", "claude-3"]}
启动后直接访问:
http://你的服务器IP:端口/docs
http://你的服务器IP:端口/openapi.json
第二种:使用 Swaggo 注解生成。
Go 生态里最常用,适合 one-api 这类项目。
先在项目根目录安装工具:
go install github.com/swaggo/swag/cmd/swag@latest
在路由函数上方写注解,例如:
// @Summary 获取模型列表
// @Tags 模型
// @Produce json
// @Success 200 {object} Response
// @Router /v1/models [get]
func ListModels(c *gin.Context) {}
然后执行:
swag init
生成 docs 目录后,在 main.go 中注册 Swagger 路由:
import (
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
docs "你的项目路径/docs"
)
docs.SwaggerInfo.Title = "中转系统 API"
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
重新编译并启动服务,打开 /swagger/index.html 就能看到带测试按钮的文档页面。
配置后如何验证输出是否正常
文档页面能打开不代表输出一定符合 OpenAPI 规范,建议做两步验证。
先用浏览器访问 JSON 地址,确认返回内容中包含 openapi 字段和 paths 节点:
curl http://127.0.0.1:3000/openapi.json | head -50
正常的输出里应能看到类似结构:
{
"openapi": "3.0.0",
"info": {
"title": "中转系统 API",
"version": "1.0.0"
},
"paths": {}
}
如果 paths 为空,说明路由注解没写全或 swag 没有扫描到对应 controller。
这时检查代码注释格式,重新执行 swag init 并重启服务。
再验证 UI 界面是否能列出所有接口。
打开 /swagger/index.html,左侧应该能展开各个分组,点击接口能看到参数说明和返回值示例。
如果界面 404,多半是静态文件路径没注册对,检查路由注册是否在监听端口上生效。
常见报错与避坑指南
报错一:swag init 生成 docs 失败,提示解析错误。 多数原因是注解缩进不对或注释里出现了特殊字符。
尽量保持注解和函数之间没有空行,且 // 后必须带空格。
报错二:接口文档能打开,但显示 No operations defined in spec。 这是扫描不到路由的表现。
确认项目里是否使用了分组路由,比如 /api/v1,需要把分组路由也加上注释。
也可以先运行 swag init --parseDependency 强制解析依赖包。
报错三:生产环境不想暴露文档页面。 建议通过 Nginx 对 /swagger 和 /openapi.json 加访问控制,只允许内网 IP 或 VPN 访问。
location /swagger/ {
allow 192.168.1.0/24;
deny all;
proxy_pass http://127.0.0.1:3000;
}
另外要注意,自动生成的文档只反映代码中已登记的接口,如果某个路由是动态注册的(比如根据数据库模型临时生成),需要额外写静态注解或用插件补齐。
让文档保持同步的日常维护习惯
接口文档自动生成不代表一劳永逸,代码合并前要养成运行生成命令的习惯。
建议在 CI/CD 流程中加入文档校验步骤:
swag init
if [ -f docs/swagger.json ]; then
echo "文档生成成功"
else
echo "文档生成失败,请检查注解"
exit 1
fi
同时可以打开 Swagger UI 的验证功能,确认所有响应 schema 都能正常解析。
遇到模型字段变更时,优先修改代码里的结构体 tag 和注解,不要手动改 JSON 文件,否则下次生成会被覆盖。
如果你正在处理 108.中转系统接口文档自动生成,OpenAPI/Swagger输出,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
等文档能稳定输出后,再考虑接入 API 网关的文档聚合功能,把多个服务的 OpenAPI 合并成一个统一入口。