溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

gin怎么自定義中間件解決requestBody不可重復(fù)讀問(wèn)題

發(fā)布時(shí)間:2023-05-05 14:56:22 來(lái)源:億速云 閱讀:155 作者:iii 欄目:開(kāi)發(fā)技術(shù)

今天小編給大家分享一下gin怎么自定義中間件解決requestBody不可重復(fù)讀問(wèn)題的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

先直接上代碼

r := gin.Default()
	// 注冊(cè)中間件,使body可以重復(fù)讀取
	r.Use(func(context *gin.Context) {
		all, err := context.GetRawData() // 讀取body的內(nèi)容
		if err != nil {
			log.Fatal(err)
		}
		// 重寫(xiě) GetBody 方法,以便后續(xù)的其他操作
		context.Request.GetBody = func() (io.ReadCloser, error) {
			context.Request.Body = io.NopCloser(bytes.NewBuffer(all))
			buffer := bytes.NewBuffer(all)
			closer := io.NopCloser(buffer)
			return closer, nil
		}
		body, _ := context.Request.GetBody()  // 每次調(diào)用GetBody方法,都會(huì)新生成一個(gè)io.ReadCloser,但是底層的byte數(shù)據(jù),都是all變量緩存的。
		context.Request.Body = body
		context.Next()
	})

注意,上面的中間件,需要在第一個(gè)執(zhí)行。

分析

在gin中,context.Request.Body 是一個(gè)io.ReadCloser的接口,如下圖

gin怎么自定義中間件解決requestBody不可重復(fù)讀問(wèn)題

查看io.ReadCloser接口定義

type ReadCloser interface {
	Reader
	Closer
}
type Reader interface {
	Read(p []byte) (n int, err error)
}
type Closer interface {
	Close() error
}

我們發(fā)現(xiàn)io.ReaderCloser接口的本質(zhì)就是Read(p []byte) (n int, err error) 和 Close() error 的組合。

所以我們只需要自己編寫(xiě)實(shí)現(xiàn)Read(p []byte) (n int, err error) 和 Close() error 這兩個(gè)方法的結(jié)構(gòu)體即可賦值給context.Request.Body,在我們自己實(shí)現(xiàn)的方法中實(shí)現(xiàn)可重復(fù)讀取即可達(dá)到我們的目的。

以上就是“gin怎么自定義中間件解決requestBody不可重復(fù)讀問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI