第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我如何在一個處理程序中更多地使用 http.Request?

我如何在一個處理程序中更多地使用 http.Request?

Go
慕神8447489 2023-08-07 15:05:50
我有一個基本的中間件,它是一個 Logger 函數(shù),當我body, err := ioutil.ReadAll(r.Body)在接下來的每個函數(shù)中執(zhí)行時,http.Request 將為空。但我希望身體包含信息。我能做些什么?開始:r.HandleFunc("/login", server.Loger(server.GetTokenHandler()).ServeHTTP).Methods("POST")所以它是中間件:func (server Server) Loger(h http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        body, _ := ioutil.ReadAll(r.Body)        server.Log.Info(r.URL, " Methods: ", r.Method, string(body))        h.ServeHTTP(w, r) //Calls handler h    })}現(xiàn)在 r.Body 將為空:func (server Server) GetTokenHandler()  http.Handler{    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        body, err := ioutil.ReadAll(r.Body)        if err != nil{            http.Error(w, "", 400)            server.Log.Error(err)            return        }        fmt.Print(string(body))    })}
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經(jīng)驗 獲得超3個贊

只能r.Body讀取一次。沒有其他辦法了。


如果多個中間件需要訪問數(shù)據(jù),則需要將其保存為字節(jié)片并將其傳遞給后續(xù)中間件。


如果處理程序有上下文,您可以將正文數(shù)據(jù)作為上下文中的值傳遞。


另一種解決方案是 hack,是將數(shù)據(jù)存儲在 ReponseWriter 的標頭字段中。您不應忘記在返回時將其刪除,以免將其發(fā)送出去。隨后的中間件可以訪問標頭中的數(shù)據(jù)。


func (server Server) ReadBody(h http.Handler) http.Handler {

    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

        body, _ := ioutil.ReadAll(r.Body)

        w.Header().Add("body", string(body))

        h.ServeHTTP(w, r) //Calls handler h

        w.Header().Del("body")

    })

}

后續(xù)中間件將通過指令獲取主體數(shù)據(jù)data := w.Header().Get("body")。請注意,標頭值是字符串,而不是字節(jié)切片。


查看完整回答
反對 回復 2023-08-07
  • 1 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號