Go http 套件:在帶有Bodies 的請求中捕獲取消訊號
問題:為什麼Go http 套件無法擷取POST 的取消訊號帶body的請求?
答案:Go的http伺服器讀取請求body來偵測客戶端何時關閉 聯繫。在讀取正文之前,不會檢查是否已關閉連線。
因此,要正確處理此問題,請盡快讀取請求正文,即使請求處理邏輯中不需要它。
解決方案:
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 the closed connection time.Sleep(30 * time.Second) fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:]) }
當客戶端提前關閉連線時,此程式碼將偵測到它並取消任何正在進行的工作。
以上是為什麼 Go 的 `http` 套件在帶有正文的 POST 請求中丟失取消訊號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!