• gin中间件实现


    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")
    }
    

      

     
  • 相关阅读:
    04_移动端-伪元素选择器
    03_移动端-结构伪类选择器
    02_移动端-属性选择器
    Dva+Antd创建React项目(一)
    Windows 10 使用打印机扫描
    中间件-redis
    #期望dp#51nod 2015 诺德街
    Codeforces Round #685 (Div. 2)
    USACO 4.2
    #保序回归问题,单调栈,二分#洛谷 5294 [HNOI2019]序列
  • 原文地址:https://www.cnblogs.com/wlike/p/16825230.html
Copyright © 2020-2023  润新知