gin 處理json 使用 Go 處理中介軟體

2021-10-13 17:32:15 字數 2639 閱讀 1511

開發 web 應用的時候, 很多地方都需要使用中介軟體來統一處理一些任務, 比如記錄日誌, 登入校驗等.

gin 也提供了中介軟體功能.

在專案建立之初, 就已經匯入了一些中介軟體, 當時沒有仔細介紹.

g.use(gin.logger())

g.use(gin.recovery())

g.use(middleware.nocache())

g.use(middleware.options())

g.use(middleware.secure())

前面兩個是 gin 自帶的中介軟體, 分別是日誌記錄和錯誤恢復. 後面三個是設定一些 header, 具體是阻止快取響應, 響應 options 請求, 以及瀏覽器安全設定.

// 阻止快取響應

func nocache() gin.handlerfunc

}// 響應 options 請求, 並退出

func options() gin.handlerfunc else

}}// 安全設定

func secure() gin.handlerfunc

// also consider adding content-security-policy headers

// ctx.header("content-security-policy", "script-src 'self' ")}}

gin 的中介軟體結構就是乙個返回func(ctx *gin.context)的函式, 又叫做gin.handlerfunc. 本質上和普通的 handler 沒什麼不同,gin.handlerfuncfunc(*context)的別名.

中介軟體可以被定義在三個地方

一點需要注意的是在 middleware 和 handler 中使用 goroutine 時, 應該使用 gin.context 的唯讀副本, 例如ccp := context.copy().

另一點則是注意中介軟體的順序.

官方的示例如下:

func logger() gin.handlerfunc 

}

介紹了 gin 的中介軟體知識之後, 就可以根據需求使用中介軟體了.

實現乙個中介軟體在每個請求中設定x-request-id頭.

// 在請求頭中設定 x-request-id

func requestid() gin.handlerfunc

ctx.set("x-request-id", requestid)

ctx.header("x-request-id", requestid)

ctx.next()}}

設定 header 的同時儲存在 context 內部, 通過設定唯一的 id 之後, 就可以追蹤一系列的請求了.

再來實現乙個日誌記錄的中介軟體, 雖然 gin 已經自帶了日誌記錄的中介軟體, 但自己實現可以更加個性化.

// 定義日誌元件, 記錄每乙個請求

func logging() gin.handlerfunc

var bodybytes byte

if ctx.request.body != nil

// 讀取後寫回

ctx.request.body = ioutil.nopcloser(bytes.newbuffer(bodybytes))

blw := &bodylogwriter

ctx.writer = blw

start := time.now()

ctx.next()

// 計算延遲, 和 gin.logger 的差距有點大

// 這是因為 middleware 類似棧, 先進後出, ctx.next() 是轉折點

// 所以 gin.logger 放在最前, 記錄總時長

// logging 放在最後, 記錄實際執行的時間, 不包含其他中介軟體的耗時

end := time.now()

latency := end.sub(start)

code, message := -1, ""

var response handler.response

if err := json.unmarshal(blw.body.bytes(), &response); err != nil else

logrus.withfields(logrus.fields).info("記錄請求")}}

在註冊中介軟體的時候, 將logging放在全域性中介軟體的最後, 將 gin.logger() 放在全域性中介軟體的最開始. 通過對比延遲, 你可以發現, 在 handler 處理比較快時, 中介軟體在總請求耗時中佔據了很大的比例.

所以, 中介軟體雖然非常實用, 但需要控制全域性中介軟體的數量.

中介軟體是非常實用的, 基本上 web 框架都會實現.

作為版本 v0.8.0

GO語言 處理未知JSON資料

當未知json資料時 package main import encoding json fmt io ioutil log func readfilefrompath path string byte return content func main json.unmarshal content,...

go接收json資料處理

go對json資料進行解碼,有兩種方式 client http.client 方式一 json.unmarshal b,err ioutil.readall response.body if err nil data byte string b err json.unmarshal data,use...

go語言程式設計 json資料處理

本文介紹如何使用go語言自帶的庫把物件轉換為json格式,以及如何將json格式的資料轉換為物件 go語言自帶了乙個包,可以用來處理json格式的資料 包匯入 encoding json 函式原型 func marshal v inte ce byte,error 在go語言中,要把資料轉換為jso...