1. 无中间件启动
#使用
r := gin.New()
#替代
// 默认启动方式,包含 Logger、Recovery 中间件
r := gin.Default()
2. 中间件启动
func main() {
// 创建一个不包含中间件的路由器
r := gin.New()
// 全局中间件
// 使用 Logger 中间件
r.Use(gin.Logger())
// 使用 Recovery 中间件
r.Use(gin.Recovery())
// 路由添加中间件,可以添加任意多个
r.GET("/benchmark", MyBenchLogger(), benchEndpoint)
// 路由组中添加中间件
// authorized := r.Group("/", AuthRequired())
// exactly the same as:
authorized := r.Group("/")
// per group middleware! in this case we use the custom created
// AuthRequired() middleware just in the "authorized" group.
authorized.Use(AuthRequired())
{
authorized.POST("/login", loginEndpoint)
authorized.POST("/submit", submitEndpoint)
authorized.POST("/read", readEndpoint)
// nested group
testing := authorized.Group("testing")
testing.GET("/analytics", analyticsEndpoint)
}
// Listen and serve on 0.0.0.0:8080
r.Run(":8080")
}
3. 自定义组件
实现token的验证
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"time"
)
func MyLogger() gin.HandlerFunc {
return func(c *gin.Context) {
t := time.Now()
c.Set("example", "123456")
//让原本改执行的逻辑继续执行
c.Next()
end := time.Since(t)
fmt.Printf("耗时:%V\n", end)
status := c.Writer.Status()
fmt.Println("状态", status)
}
}
func TokenRequired() gin.HandlerFunc {
return func(c *gin.Context) {
var token string
for k, v := range c.Request.Header {
if k == "X-Token" {
token = v[0]
} else {
fmt.Println(k, v)
}
}
if token != "bobby" {
c.JSON(http.StatusUnauthorized, gin.H{
"msg": "未登录",
})
//挑战 为什么连return都阻止不了后续逻辑的执行
c.Abort()
}
c.Next()
}
}
func main() {
router := gin.Default()
//使用logger和recovery中间件 全局所有
router.Use(MyLogger())
router.GET("/logger", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "logger",
})
})
router.Run(":8083")
//router := gin.Default()
////使用logger和recovery中间件 全局所有
//router.Use(TokenRequired())
//
//router.GET("/ping", func(c *gin.Context) {
// c.JSON(http.StatusOK, gin.H{
// "message": "pong",
// })
//})
//
//router.Run(":8083")
}