您好,登錄后才能下訂單哦!
今天小編給大家分享一下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的接口,如下圖
查看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è)資訊頻道。
免責(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)容。