题目描述
初学go,很菜,使用 go 和 gin 时,静态资源的路由与后端api路由冲突,在网上找过很多方式都不起效果。
一开始想用此文方法:http://wu.run/2021/03/19/solve-gin-router-path-conflict/,但是报错(应该是我的原因)
出错代码
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 设置为生产模式,debug模式去掉即可
// gin.SetMode(gin.ReleaseMode)
r := gin.Default()
// 静态资源
r.Static("/", "./assets")
// api
api := r.Group("/api/v1")
{
api.GET("user", Test)
}
// 端口
r.Run(":8080")
}
func Test(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
}
报错:panic: '/api/v1/:user' in new path '/api/v1/:user' conflicts with existing wildcard '/filepath' in existing prefix '/filepath'
目录:
├─assets
└─index.html
├─vendor
├─github.com
└─...........
├─go.mod
├─go.sum
└─main.go
期望结果
访问 localhost:8080 是静态页面,访问localhost:8080/api/v1/user 返回 json
希望高人指点一下,非常感谢。
这种肯定不行的。文件路由相当于
*
号,就是会捕获所有路由,gin 的路由没有降级什么的,就是简单的动态与静态路由,如果冲突会直接报错。你现在这个问题,直接把文件路由添加个前缀
/file
就好了,这样/file/image.png
就会命中文件路由。其实还有个注意的地方就是比如
users/:id
,users/article
这两个路由也是不行的,因为两者前缀一致,后面的部分:id
与article
冲突了。最简单的方法就是动态路由统一增加一个标识符比如:users/_:id
这样就不会与users/article
冲突了,因为前缀不一样。gin的路由就是一个前缀树的结构,动态路由独占一个节点。