1 回答

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é)切片。
- 1 回答
- 0 關(guān)注
- 132 瀏覽
添加回答
舉報