起因
最近在写前后端分离项目,然后在前端访问后端提供的接口时,会出现CORS问题。
查找资料发现,Gin官方是有提供中间件的https://github.com/gin-contrib/cors
先在terminal输入 go get github.com/gin-contrib/cors
然后就按照官方的使用例子就行:
package main
import (
"time"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.Use(cors.Default())
router.Run()
}
然后我以为这个是可以作用于路由,于是就这么用了:
package main
import (
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
engine := gin.Default()
myGroup := engine.Group("/myGroup").Use(cors.Default())
{
myGroup.GET("/myRouter", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "myRouter",
})
})
}
}
结果我调试了,还以为是CORS中间件出问题了。
过程
最后定位到是Gin中的Engine.Use()
与RouterGroup.Use()
的实现是不同的:
可以看到gin.Engine
的Use()
比gin.RouterGroup
的Use()
多两个调用
这两个调用其实影响的是Engine.allNoMethod
与Engine.allNoRoute
,也就是在所有[方法:路由]处理前都会调用的中间件。
解决方法
于是只需要在最开始分配Engine的时候Use(cors.Default())
就好啦