You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为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的文件开头:
    // @title 子路径接口文档
    // @basePath /api/v1/sub
    // @tags B
    package handlerB
    
    这样生成的文档里,标签B下的接口就会自动使用/api/v1/sub作为基础路径,不用在每个@router里加/sub了。

方案2:自定义Swag模板添加多Servers配置

如果你需要在Swagger UI里显示多个基础路径选项(就是你提到的servers数组),可以通过修改swag的模板来实现:

  1. 先导出swag的默认模板到本地:
    swag init --dump-template ./swagger-templates
    
  2. 找到模板文件(比如swagger.json.tmpl),找到"servers"对应的位置,把原来的单服务器配置改成数组:
    "servers": [
      {
        "url": "{{.BasePath}}",
        "description": "主服务地址"
      },
      {
        "url": "{{.BasePath}}/sub",
        "description": "子服务地址"
      }
    ]
    
  3. 然后用自定义模板重新生成文档:
    swag init --template-dir ./swagger-templates
    
    这样生成的swagger.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

火山引擎 最新活动