在Go Chi 中間件處理程序中重複使用HTTP 請求體
在Go 中,當使用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 }
註冊處理程序嘗試讀取請求正文並處理它。但是,在此步驟之後,當呼叫 Create 處理程序時,由於請求正文為空,因此無法解析請求正文中的 JSON。發生這種情況是因為外部處理程序將請求正文讀取到末尾,而沒有為內部處理程序留下任何可讀取的內容。
要解決此問題,必須透過恢復外部處理程序中先前讀取的資料來恢復請求正文。以下程式碼片段示範如何實現此目的:
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 所需的 io.ReadCloser。透過恢復請求正文,後續處理程序可以按預期存取和處理其內容。
以上是如何在 Go Chi 中介軟體處理程序中重複使用 HTTP 請求主體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!