如何为swaggo/swag中不同标签定义独立基础路径?
解决Swaggo中为特定标签设置不同基础路径的问题
我之前在使用swaggo生成Go项目的Swagger文档时,也遇到过类似的痛点——不想在每个接口的@router里重复写相同的子路径。下面给你几个靠谱的解决方案:
方案1:结合路由分组与Swag注释实现标签级基础路径
如果你的项目用的是Gin、Echo这类支持路由分组的框架,这是最优雅的方式:
- 先把标签A和标签B的接口分别放在不同的路由分组里:
// 标签A的路由组(全局基础路径/api/v1) v1Group := r.Group("/api/v1") { v1Group.POST("/getList", handlerA.GetList) } // 标签B的路由组(子基础路径/api/v1/sub) subGroup := r.Group("/api/v1/sub") { subGroup.POST("/getList", handlerB.GetList) } - 然后在每个分组对应的控制器文件顶部,添加
@tags和@basePath注释(这个@basePath会覆盖全局基础路径,只作用于当前文件内的接口):
比如handlerB的文件开头:
这样生成的文档里,标签B下的接口就会自动使用// @title 子路径接口文档 // @basePath /api/v1/sub // @tags B package handlerB/api/v1/sub作为基础路径,不用在每个@router里加/sub了。
方案2:自定义Swag模板添加多Servers配置
如果你需要在Swagger UI里显示多个基础路径选项(就是你提到的servers数组),可以通过修改swag的模板来实现:
- 先导出swag的默认模板到本地:
swag init --dump-template ./swagger-templates - 找到模板文件(比如
swagger.json.tmpl),找到"servers"对应的位置,把原来的单服务器配置改成数组:"servers": [ { "url": "{{.BasePath}}", "description": "主服务地址" }, { "url": "{{.BasePath}}/sub", "description": "子服务地址" } ] - 然后用自定义模板重新生成文档:
这样生成的swag init --template-dir ./swagger-templatesswagger.json里就会包含你需要的多servers配置,用户在Swagger UI里可以切换不同的基础路径。
方案3:生成后手动修改swagger.json(应急方案)
如果上面两种方法都暂时没法用,你可以在swag init生成文档后,手动打开docs/swagger.json,找到servers字段,改成你需要的数组格式:
"servers": [ { "url": "https://localhost:8080/api/v1/" }, { "url": "https://localhost:8080/api/v1/sub/" } ]
不过这个方法每次生成文档后都要重新改,适合临时测试用,不推荐长期使用。
内容的提问来源于stack exchange,提问作者Subhransu Sekhar




