首頁 >後端開發 >Golang >如何跨 Go-chi 中間件處理程序重複使用 HTTP 請求正文資料?

如何跨 Go-chi 中間件處理程序重複使用 HTTP 請求正文資料?

Barbara Streisand
Barbara Streisand原創
2024-12-08 15:24:12288瀏覽

How to Reuse HTTP Request Body Data Across Go-chi Middleware Handlers?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn