Go 中使用HTTP 請求體進行客戶端取消
處理HTTP 請求時,能夠優雅地回應客戶端取消訊號非常重要資源管理。雖然 Go 的 context 套件提供了捕獲取消的機制,但在某些情況下它可能不會按預期運行。
為什麼 GET 和 POST 請求不同
GET 之間的行為差異和 POST 請求源自 HTTP 處理請求的方式伺服器。
使用請求主體捕獲取消
要捕獲帶有主體的請求的取消信號,立即開始讀取請求主體至關重要。 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中文網其他相關文章!