AdSense

網頁

2021/11/13

Golang Gin Context.Abort() 用途

Gin Context.Abort()可終止後續的handler繼續執行。


下面router先後設定了兩個middleware handler Hello()Hi()Hello()中調用了Context.Abort(),則之後的Hi()/demopath handler都不會執行,但目前的handler仍會執行到結束。

package main

import (
    "fmt"

    "github.com/gin-gonic/gin"
)

func main() {

    router := gin.New()
    router.Use(
        Hello(),
        Hi(),
    )

    router.GET("/demo", func(c *gin.Context) {
        msg := "demo"
        fmt.Println(msg)
        c.JSON(200, msg)
    })
    router.Run()

}

func Hello() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("hello")
        c.Abort()
        fmt.Println("bye")
    }
}

func Hi() gin.HandlerFunc {
    return func(c *gin.Context) {
        fmt.Println("hi")
        c.Next()
        fmt.Println("chao")
    }
}

啟動專案發送請求至/demo印出結果如下:

hello
bye


下面middleware函式IsLower()檢查url參數name的值是否為全小寫,若否則調用Context.Abort()終止後續handler並返回錯誤訊息。

package main

import (
    "fmt"
    "unicode"

    "github.com/gin-gonic/gin"
)

func main() {

    router := gin.New()
    router.Use(
        IsLower(),
    )

    router.GET("/demo", func(c *gin.Context) {
        msg := "demo"
        fmt.Println(msg)
        c.JSON(200, msg)
    })
    router.Run()

}

func IsLower() gin.HandlerFunc {
    return func(c *gin.Context) {
        name := c.Query("name")
        for _, r := range name {
            if !unicode.IsLetter(r) || !unicode.IsLower(r) {
                c.Abort()
                c.JSON(500, "error")
                return
            } else {
                c.Next()
            }
        }
    }
}

沒有留言:

AdSense