我有一个定义 user_agent 的函数:
func getUserAgent(c *gin.Context) bool {
ua := ua.Parse(c.Request.UserAgent())
if ua.Bot {
return false
} else {
return true
}
}
另外,我有路线,我需要在每个路线中调用 getUserAgent ,如果为真 - 使用我的路线,如果为假 - 返回其他内容。我该怎么做?
路线:
func Routes(router *gin.Engine) {
router.GET("/user_agent", getUserAgent)
router.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
})
router.GET("/:some_urls", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
})
categories := router.Group("/categories")
{
categories.GET("/", controller.GetAllCategories)
}
router.GET("/category_detail", controller.GetCategoriesById)
products := router.Group("/products")
{
products.GET("/", controller.GetAllProducts_by_multi_params)
}
...
也许你可以将
getUserAgent
作为中间件,如下所示
每个路由器都会首先进入 getUserAgent
然后运行处理程序。
router.Use(getUserAgent)
你可以把它做成这样的中间件:
package middlewares
import (
"net/http"
"github.com/gin-gonic/gin"
)
func CheckUserAgent() gin.HandlerFunc {
return func(c *gin.Context) {
ua := ua.Parse(c.Request.UserAgent())
if ua.Bot {
c.AbortWithStatus(http.StatusForbidden)
return
}
c.Next()
}
}
请注意,您还需要从包中导入“ua”。 然后将中间件添加到您需要保护的路由中,如下所示:
products := router.Group("/products")
{
products.GET("/", middlewares.CheckUserAgent(), controller.GetAllProducts_by_multi_params)
}