在Go-chi 中間件處理程序中重複使用HTTP 請求體
使用go-chi 進行HTTP 路由時,可以方便地在多個中重複使用程式碼處理程序。但是,如果處理程序依賴請求正文數據,這可能會導致意外問題。
考慮以下場景:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created // ...other code // if all good then create new user user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code // ... there I get the problem with parse JSON from &b }
在此範例中,註冊和建立處理程序都嘗試讀取使用 ioutil.ReadAll 的請求正文。但是,由於 Registration 會讀取正文到末尾,因此在呼叫 Create 時沒有剩餘資料可供讀取。
要解決此問題,外部處理程序(Registration)必須使用先前讀取的資料復原請求正文。這可以使用以下程式碼來實現:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := io.ReadAll(r.Body) // ...other code r.Body = io.NopCloser(bytes.NewReader(b)) user.Create(w, r) }
這裡,bytes.NewReader() 函數在位元組切片上傳回io.Reader,而io.NopCloser 函數將此讀取器轉換為io.Reader 。 r.Body 需要 ReadCloser 介面。透過使用原始資料重設 r.Body,Create 現在可以按預期存取和解析請求正文。
以上是如何跨 Go-chi 中間件處理程序重複使用 HTTP 請求正文資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!