欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

目錄

柚子快報(bào)激活碼778899分享:Gin框架中的中間件

柚子快報(bào)激活碼778899分享:Gin框架中的中間件

http://yzkb.51969.com/

什么是中間件

中間件(middleware)是一種獨(dú)立的組件或模塊,通常是一個(gè)函數(shù)或一組函數(shù),常被用于處理請(qǐng)求或事件的過程中

中間件常用來實(shí)現(xiàn)一些通用的功能,如日志記錄、權(quán)限校驗(yàn)、數(shù)據(jù)加工等

簡(jiǎn)單理解,中間件就是一面墻,立在函數(shù)的前面,每次調(diào)用這個(gè)函數(shù)前都要經(jīng)過中間件。最容易想到的應(yīng)用場(chǎng)景就是權(quán)限校驗(yàn),用戶不登陸就無法發(fā)布文章等等

Gin中的中間件

Gin框架中的中間件是一個(gè)gin.HandlerFunc類型,可以為每個(gè)路由添加任意數(shù)量的中間件

// GET is a shortcut for router.Handle("GET", path, handle).

func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {

return group.handle(http.MethodGet, relativePath, handlers)

}

在源碼中可以看到后面的參數(shù)為...HandlerFunc,是一個(gè)可變長(zhǎng)度的HandlerFunc類型

配置路由的時(shí)候在回調(diào)函數(shù)前加上一個(gè)HandlerFunc類型的函數(shù),就完成了中間件的注冊(cè)

// 簡(jiǎn)單的中間件實(shí)現(xiàn)

package main

import (

"fmt"

"github.com/gin-gonic/gin"

)

func test(c *gin.Context) {

fmt.Println("test")

c.JSON(200, gin.H{

"message": "Test",

})

}

func m1(c *gin.Context) {

fmt.Println("m1......")

}

func main() {

router := gin.Default()

router.GET("/test", m1, test)

router.Run()

}

// m1......

// test

訪問localhost:8080后,控制臺(tái)會(huì)依次打印

m1......

test

在執(zhí)行路由處理函數(shù)test之前,先經(jīng)過了m1中間件,這就是中間件最簡(jiǎn)單的使用

除了給路由單獨(dú)注冊(cè)中間件,也可以使用use()函數(shù)全局注冊(cè)

// Use attaches a global middleware to the router. i.e. the middleware attached through Use() will be

// included in the handlers chain for every single request. Even 404, 405, static files...

// For example, this is the right place for a logger or error management middleware.

func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {

engine.RouterGroup.Use(middleware...)

engine.rebuild404Handlers()

engine.rebuild405Handlers()

return engine

}

// 簡(jiǎn)單的全局注冊(cè)中間件

package main

import (

"fmt"

"github.com/gin-gonic/gin"

)

func test(c *gin.Context) {

fmt.Println("test")

c.JSON(200, gin.H{

"message": "Test",

})

}

func index(c *gin.Context) {

fmt.Println("index")

c.JSON(200, gin.H{

"message": "Index",

})

}

func m1(c *gin.Context) {

fmt.Println("m1......")

}

func main() {

router := gin.Default()

// 全局注冊(cè)m1中間件

router.Use(m1)

router.GET("/test", test)

router.GET("/index", index)

router.Run()

}

router.use()就可以實(shí)現(xiàn)全局注冊(cè),每一個(gè)路由都注冊(cè)了此中間件

還可以給路由組注冊(cè)

// 寫法1

testGroup := router.Group("/test", m1)

{

testGroup.GET("/test1", func(c *gin.Context) {...})

...

}

// 寫法2

testGroup := router.Group("/test")

testGroup.Use(m1)

{

testGroup.GET("/test1", func(c *gin.Context) {...})

...

}

流程控制?

單純的打印文字到控制臺(tái)上沒有意義,可以結(jié)合流程控制語(yǔ)句實(shí)現(xiàn)一些功能

比如寫一個(gè)Cors跨域中間件,這里只是舉一個(gè)中間件的使用例子,不再介紹關(guān)于跨域相關(guān)內(nèi)容,感興趣可以查看:跨源資源共享(CORS) - HTTP | MDN (mozilla.org)

// Cors 跨域處理

func Cors() gin.HandlerFunc {

return func(c *gin.Context) {

// 允許所有的域名進(jìn)行跨域請(qǐng)求

c.Header("Access-Control-Allow-Origin", "*")

// 允許跨域的請(qǐng)求頭

c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")

// 允許跨域請(qǐng)求的方法

c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")

// 允許跨域請(qǐng)求的響應(yīng)頭

c.Header("Access-Control-Expose-Headers",

"Content-Length, Access-Control-Allow-Origin, "+

"Access-Control-Allow-Headers, Content-Type")

// 允許跨域請(qǐng)求攜帶cookie

c.Header("Access-Control-Allow-Credentials", "true")

method := c.Request.Method

// OPTIONS方法用于獲取目的資源所支持的通信選項(xiàng)

if method == "OPTIONS" {

// 如果是OPTIONS請(qǐng)求,直接返回空響應(yīng)

c.AbortWithStatus(http.StatusNoContent)

}

// 處理請(qǐng)求

c.Next()

}

}

在gin框架中,中間件流程控制函數(shù)包括:

1. c.Next(): 調(diào)用該函數(shù)會(huì)將控制權(quán)交給下一個(gè)中間件函數(shù),如果沒有下一個(gè)中間件函數(shù),則將控制權(quán)交給處理請(qǐng)求的路由處理函數(shù)

2. c.Abort(): 調(diào)用該函數(shù)會(huì)立即終止當(dāng)前中間件函數(shù)的執(zhí)行,并且不會(huì)再調(diào)用后續(xù)的中間件函數(shù)或路由處理函數(shù)

3. c.AbortWithStatus(code int): 調(diào)用該函數(shù)會(huì)終止當(dāng)前中間件函數(shù)的執(zhí)行,并返回指定的HTTP狀態(tài)碼給客戶端

4. c.NextWithError(): 調(diào)用該函數(shù)會(huì)將控制權(quán)交給下一個(gè)中間件函數(shù),同時(shí)傳遞一個(gè)錯(cuò)誤給下一個(gè)中間件函數(shù)或路由處理函數(shù)

5. c.IsAborted(): 該函數(shù)用于判斷當(dāng)前請(qǐng)求是否已經(jīng)被終止,返回一個(gè)布爾值表示請(qǐng)求是否已經(jīng)被終止

看一個(gè)簡(jiǎn)單的使用流程控制的例子

package main

import (

"fmt"

"github.com/gin-gonic/gin"

)

func test(c *gin.Context) {

fmt.Println("test")

c.JSON(200, gin.H{

"message": "Test",

})

}

func m1(c *gin.Context) {

fmt.Println("m1 begin")

c.Next()

fmt.Println("m1 end")

}

func m2(c *gin.Context) {

fmt.Println("m2 begin")

c.Next()

fmt.Println("m2 end")

}

func main() {

router := gin.Default()

router.GET("/test", m1, m2, test)

router.Run()

}

// m1 begin

// m2 begin

// test

// m2 end

// m1 end

?c.Next()的作用是先調(diào)用下一個(gè)函數(shù),下一個(gè)函數(shù)執(zhí)行完之后再回頭執(zhí)行中間件后面的語(yǔ)句

整個(gè)過程就像洋蔥一樣

?

內(nèi)置中間件

Gin框架也內(nèi)置一些中間件,可以直接使用

func BasicAuth(accounts Accounts) HandlerFunc

func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc

func Bind(val interface{}) HandlerFunc

func ErrorLogger() HandlerFunc

func ErrorLoggerT(typ ErrorType) HandlerFunc

func Logger() HandlerFunc

func LoggerWithConfig(conf LoggerConfig) HandlerFunc

func LoggerWithFormatter(f LogFormatter) HandlerFunc

func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc

func Recovery() HandlerFunc

func RecoveryWithWriter(out io.Writer) HandlerFunc

func WrapF(f http.HandlerFunc) HandlerFunc

func WrapH(h http.Handler) HandlerFunc

而在使用gin.Default()返回的gin.Engine,會(huì)默認(rèn)使用Recovery和Logger中間件,從gin.Default的源碼可以看出來

// Default returns an Engine instance with the Logger and Recovery middleware already attached.

func Default() *Engine {

debugPrintWARNINGDefault()

engine := New()

engine.Use(Logger(), Recovery())

return engine

}

?如果不想使用默認(rèn)中間件,可以使用gin.New()方法返回一個(gè)不帶中間件的gin.Engine對(duì)象

總結(jié)

中間件是一個(gè)將具體業(yè)務(wù)和底層邏輯解耦的組件,在后端開發(fā)中有很多應(yīng)用場(chǎng)景,像攔截、鑒權(quán)、日志等功能可以通過中間件簡(jiǎn)單的實(shí)現(xiàn)

柚子快報(bào)激活碼778899分享:Gin框架中的中間件

http://yzkb.51969.com/

文章鏈接

評(píng)論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。

轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/18604020.html

發(fā)布評(píng)論

您暫未設(shè)置收款碼

請(qǐng)?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄