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

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

Susan Sarandon
發布: 2024-12-05 11:19:10
原創
355 人瀏覽過

How Can I Reuse an HTTP Request Body in Go Middleware Handlers?

在Go 中間件處理程序中重複使用HTTP 請求體

在Go 的net/http 套件中,中間件處理程序提供了一種便捷的方法來處理和修改傳入的內容在由實際應用程式程式碼處理之前的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
}
登入後複製

在此場景中,註冊處理程序將請求正文讀取到變數b 中,並將請求r 傳遞給user.Create 處理程序,該處理程序嘗試再次讀取正文。但是,這會導致錯誤,因為主體已被註冊處理程序使用。

此問題的解決方案很簡單:在讀取請求主體後,在外部處理程序中復原請求主體。這可以使用bytes.NewReader() 和io.NopCloser 函數來實現:

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 中介軟體處理程序中重複使用 HTTP 請求正文?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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