首頁 >後端開發 >Golang >如何檢查 HTTP 請求正文而不丟失後續處理程序的資料?

如何檢查 HTTP 請求正文而不丟失後續處理程序的資料?

Linda Hamilton
Linda Hamilton原創
2024-12-25 01:27:14496瀏覽

How Can I Inspect an HTTP Request Body Without Losing Data for Subsequent Handlers?

使用HTTP.Handler 檢查正文時保留請求狀態

在實現HTTP 處理程序的上下文中,使用以下方法存取請求正文.ParseForm() 可能會造成一個困境。雖然這種檢查通常是必要的,但它可能會耗盡請求的正文流,使其無法用於後續處理程序(例如反向代理)。

問題:耗盡正文流

當透過呼叫req.ParseForm() 等方法消耗請求正文時,req.Body.Reader 流將被耗盡,沒有為下游處理程序留下任何剩餘數據。這會導致代理轉發時出現錯誤,因為預期的請求正文長度不再與耗盡狀態相符。

解:分割正文流

克服此挑戰,可以採用涉及緩衝層的技術。透過將請求正文讀入緩衝區並使用該緩衝區建立多個新讀取器,我們可以將檢查與原始正文流分開。

步驟:

  1. 使用 io.ReadAll(r.Body) 將原始請求正文讀入緩衝區。
  2. 使用一個新的讀取器來執行主體檢查(例如,doStuff(rdr1))。
  3. 將第二個新的讀取器指派給r.Body,為後續操作保留原始狀態

示例:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2

好處:

  1. 保留請求狀態: 原始的req.Body保持完整後續處理程序。
  2. 支援正文解析:像 req.ParseForm() 這樣的檢查方法可以在單獨的讀取器上使用,而不影響請求狀態。
  3. 支援自訂主體處理: 單獨的讀取器允許自訂主體處理,而不會幹擾下游操作。

以上是如何檢查 HTTP 請求正文而不丟失後續處理程序的資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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