首頁 >後端開發 >Golang >Go 如何處理帶有正文的 HTTP 請求中的客戶端取消?

Go 如何處理帶有正文的 HTTP 請求中的客戶端取消?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-07 00:50:11869瀏覽

How Can Go Handle Client Cancellations in HTTP Requests with Bodies?

Go 中使用HTTP 請求體進行客戶端取消

處理HTTP 請求時,能夠優雅地回應客戶端取消訊號非常重要資源管理。雖然 Go 的 context 套件提供了捕獲取消的機制,但在某些情況下它可能不會按預期運行。

為什麼 GET 和 POST 請求不同

GET 之間的行為差異和 POST 請求源自 HTTP 處理請求的方式伺服器。

  • GET: GET 要求沒有請求正文,因此伺服器可以立即開始處理請求。
  • POST: POST 請求有一個請求主體,伺服器必須等待收到完整的主體才能處理該請求request.

使用請求主體捕獲取消

要捕獲帶有主體的請求的取消信號,立即開始讀取請求主體至關重要。 Go 的 http 伺服器僅在應用程式讀取請求正文時檢查關閉的連線。

解決方案:

為了確保儘早捕獲取消訊號,請修改請求處理程序立即開始讀取請求正文:

func handler(w http.ResponseWriter, r *http.Request) {
    go func(done <-chan struct{}) {
        <-done
        fmt.Println("message", "client connection has gone away, request got cancelled")
    }(r.Context().Done())

    io.Copy(ioutil.Discard, r.Body) // Read the body to detect closed connections
    time.Sleep(30 * time.Second)
    fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:])
}

此解決方案將開始讀取請求正文並同時檢查已關閉的連接,從而啟用無論請求類型如何,都會捕獲取消訊號。

以上是Go 如何處理帶有正文的 HTTP 請求中的客戶端取消?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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