首頁 > 後端開發 > Golang > 如何在 Go Chi 中介軟體處理程序中重複使用 HTTP 請求主體?

如何在 Go Chi 中介軟體處理程序中重複使用 HTTP 請求主體?

Barbara Streisand
發布: 2024-12-05 02:58:08
原創
689 人瀏覽過

How to Reuse HTTP Request Bodies in Go Chi Middleware Handlers?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板