英文:
Ignoring swagger endpoints which are not in Golang router
问题
我正在使用Swagger来生成Golang中REST API的文档。我的项目中有多个微服务。其中一些API对所有服务都是通用的,所以我将它们保持为通用的。因此,我的Golang代码如下所示:
import othercontroller "github.com/controllerv2"
func Controller() {
...
// 版本 V1 gpd
router.HandleFunc(utils.BasePath+"/entity", c.handleCreate).Methods(http.MethodPost)
router.HandleFunc(utils.BasePath+"/entity/{id}", c.handleDelete).Methods(http.MethodDelete)
othercontroller.AttachStatRoutes(utils.BasePath, router)
router.Serve()
}
"othercontroller"中的API看起来像这样:
func AttachStatRoutes(basepath string, router Router) {
router.HandleFunc(basepath+"/stats", getStatsHandler).Methods("GET")
}
func AttachHealthRoutes(basepath string, router Router) {
router.HandleFunc(basepath+"/health", getHealthHandler).Methods("GET")
}
getStatsHandler API的Swagger定义如下:
// swagger:operation GET /stats Stat
//
//
// ---
// produces:
// - application/json
// parameters:
// - name: ID
// in: query
// description: stats ID
// required: false
// type: string
// responses:
// '200':
// description: Stats response
// schema:
// "$ref": "#/definitions/StatsResponse"
// '400':
// description: Bad Request
// '403':
// description: Forbidden, you are not authorized
// '500':
// description: Error occurred while processing the request
func getStatsHandler(w http.ResponseWriter, r *http.Request) {
// 在这里添加一些逻辑
}
AttachHealthRoutes()函数中的getHealthHandler API也位于同一个包中,并且具有类似的Swagger UI定义。
现在,当我生成Swagger时,我也会得到AttachHealthRoutes()函数中的API的Swagger UI,但我没有将其附加到路由器上。
所以我需要的是,Swagger只应该为附加到路由器上的API显示UI。我假设之所以会得到AttachHealthRoutes()函数中的getHealthHandler API的Swagger,是因为getHealthHandler与getStatHandler位于同一个包中。
请注意,我不能将它们放在不同的包中。
有人可以告诉我如何从Swagger UI中去除getHealthHandler API吗?
英文:
I am using swagger to generate documentation of REST APIs in Golang. I have multiple micro-services in my project. Some of the APIs are common to all the services so I have kept them common. So my Golang code looks like this:
import othercontroller "github.com/controllerv2"
func Controller() {
...
// version V1 gpd
router.HandleFunc(utils.BasePath+"/entity", c.handleCreate).Methods(http.MethodPost)
router.HandleFunc(utils.BasePath+"/entity/{id}", c.handleDelete).Methods(http.MethodDelete)
othercontroller.AttachStatRoutes(utils.BasePath, router)
router.Serve()
}
APIs in "othercontroller" looks something like this:
func AttachStatRoutes(basepath string, router Router) {
router.HandleFunc(basepath+"/stats", getStatsHandler).Methods("GET")
}
func AttachHealthRoutes(basepath string, router Router) {
router.HandleFunc(basepath+"/health", getHealthHandler).Methods("GET")
}
Swagger definition for getStatsHandler API looks like this
// swagger:operation GET /stats Stat
//
//
// ---
// produces:
// - application/json
// parameters:
// - name: ID
// in: query
// description: stats ID
// required: false
// type: string
// responses:
// '200':
// description: Stats response
// schema:
// "$ref": "#/definitions/StatsResponse"
// '400':
// description: Bad Request
// '403':
// description: Forbidden, you are not authorized
// '500':
// description: Error occurred while processing the request
func getStatsHandler(w http.ResponseWriter, r *http.Request) {
// some logic here
}
"getHealthHandler" API of AttachHealthRoutes() function is also in the same package and has similar swagger UI definition.
Now when I generate the swagger, I am also getting swagger UI for APIs which are in AttachHealthRoutes() function but I am not attaching it to the router.
So what I need is, swagger should only show me UI for APIs which are attached to routers.
What I am assuming is, I am getting the swagger for API of AttachHealthRoutes() becasue getHealthHandler is in the same package as that of getStatHandler.
Note that I can not keep them in different packages.
Can anyone tell me how can I get rid of getHealthHandler API from swagger UI?
答案1
得分: 1
@jmoney感谢你指引我正确的方向。我在其他地方搜索解决方案,但没有搜索到生成Swagger的地方。
确实有排除选项的选项。在这里找到了它们:
https://goswagger.io/generate/spec.html
以下命令对我有效:
//go:generate swagger generate spec -m -o ./swagger.json -x, --exclude-tag=Health
英文:
@jmoney thanks for pointing me in the right direction. I was searching for the solution everywhere else but not where the swagger was getting generated.
There are indeed options to exclude options. Found them here:
https://goswagger.io/generate/spec.html
Following command worked for me:
//go:generate swagger generate spec -m -o ./swagger.json -x, --exclude-tag=Health
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论