Gin gin.Context.Abort()
可終止後續的handler繼續執行。
下面router先後設定了兩個middleware handler Hello
及Hi
。Hello
中調用了Context.Abort
,則之後的Hi
及/demo
path 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()
}
}
}
}
沒有留言:
張貼留言