gin-gonic的中介軟體使用非常簡單,這裡就不多說了,本文主要講講中介軟體的原理以及demo實現。
中介軟體是乙個洋蔥模型,中心為最終處理請求的 handler,稱為 main handler,其他為 middleware handler 。每乙個 middleware handle 可以分為兩部分,隨著 request 的流動,左邊是入,右邊為出,而分割點就是 next 。
next 的作用就是明確在這個地方進入到下乙個 handler ,如果沒有指定,預設是當前 handler 結束後進入下乙個 handler。
由此看出各 middleware handle 都是先進後出的。
deml1:
package main
import
("fmt"
)type context struct
func
(c *context)
next()
func
main()
c.handlers =
make([
]func
(*context),0
)// 註冊中介軟體
c.handlers =
(c.handlers, m1)
c.handlers =
(c.handlers, m2)
c.handlers =
(c.handlers, m3)
// 控制器函式
c.handlers =
(c.handlers, action)
// 啟動
c.handlers[0]
(c)}
func
action
(c *context)
func
m1(c *context)
func
m2(c *context)
func
m3(c *context)
m1, m2, m3 為 middleware handler,action 為 main handler。通過 next 方法實現鏈路,以上程式輸出:
m1 start
m2 start
main handler
m3 end
m2 end
符合預期,但是如果將 m2 的 c.next() 去掉了,整個鏈路就斷了,所以還要實現自動鏈路,思路就是只要鏈路被啟動了,就自動往下執行,而不依靠 next 方法。
修改 next 方法:
func
(c *context)
next()
}
這樣,除了 m1 之外,其他幾個去掉了 next 方法,也能按預期執行了,現在需要將 m1 中的 next 也去掉,則需要修改啟動方式了。
// 啟動
c.handlers[0]
(c)c.
next
()
這樣,所有的 middleware handler 都不用強依賴於 next 也能按預期執行了。
有時候我們需要人為的中斷請求,需要實現鏈路中斷,參考gin中的實現方式,它定義了乙個最大的 handler 索引最為判斷依據,並且在註冊 handler 的時候也做同樣的判斷。
於是,最終**為:
package main
import
("fmt"
"math"
)const abortindex int8
= math.maxint8 /
2type context struct
func
(c *context)
next()
}func
(c *context)
abort()
func
main()
c.handlers =
make([
]func
(*context),0
)// 註冊中介軟體
c.handlers =
(c.handlers, m1)
c.handlers =
(c.handlers, m2)
c.handlers =
(c.handlers, m3)
// 控制器函式
c.handlers =
(c.handlers, action)
// 限制handler個數
iflen
(c.handlers)
>=
int(abortindex)
// 啟動
c.handlers[0]
(c) c.
next()
}func
action
(c *context)
func
m1(c *context)
func
m2(c *context)
func
m3(c *context)
輸出為:
m1 start
m2 start
m2 end
abort方法實現了禁止向下傳播,但是不會影響當前中介軟體的執行。 gin框架中介軟體詳解
gin框架涉及中介軟體相關有4個常用的方法,它們分別是c.next c.abort c.set c.get gin框架中的中介軟體設計很巧妙,我們可以首先從我們最常用的r gin.default 的default函式開始看,它內部構造乙個新的engine之後就通過use 函式註冊了logger中介軟...
gin中介軟體講解
1 想要使用中介軟體必須是乙個 func c gin.context 型別的函式,底層實現了handefunc方法 2 中介軟體是請求和響應的分界點,無論怎麼變換給前端響應的那個動作永遠最後執行 2 use 法的作用是,將中介軟體函式存放到乙個map裡用於後續的執行,只會給c上下 新增 個屬性,並賦...
gin系列 中介軟體
gin框架允許開發者在處理請求的過程中,加入使用者自己的鉤子 hook 函式。這個鉤子函式就叫中介軟體,中介軟體適合處理一些公共的業務邏輯,比如登入認證 許可權校驗 資料分頁 記錄日誌 耗時統計等 定義中介軟體 gin中的中介軟體必須是乙個gin.handlerfunc型別 入門案例 定義乙個中介軟...