首頁  >  文章  >  後端開發  >  Go 中如何檢查 HTTP 請求是否被取消?

Go 中如何檢查 HTTP 請求是否被取消?

DDD
DDD原創
2024-11-07 14:54:03334瀏覽

How to Check if an HTTP Request Was Cancelled in Go?

如何檢查請求是否被取消

上下文和取消

在 Go 中,上下文提供了一種控制和取消操作的機制。它們允許透過 goroutine 和 HTTP 請求傳播取消訊號。

問題

在上下文中使用 HTTP 請求時,正確處理取消至關重要。在 Go 1.9 中,嘗試使用 err == context.Canceled 檢查請求是否被取消可能會導致錯誤的結果。

解決方案

在 Go 1.13 中:

檢查取消的首選方法是使用新錯誤。是函數:

ctx, cancel := context.WithCancel(context.Background())
cancel()

r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

_, err := http.DefaultClient.Do(r)
log.Println(errors.Is(err, context.Canceled)) // Prints true

errors。 Is 檢查錯誤鏈,如果鏈中的任何錯誤與提供的上下文匹配,則傳回 true。取消錯誤。

在Go 1.9-1.12 中:

對於早期版本的Go,您可以使用以下命令解決方法:

type canceledErr struct {
    error
}

func (e *canceledErr) Cancelled() bool {
    return e.Error() == "context canceled"
}

func main() {
    r, _ := http.NewRequest("GET", "http://example.com", nil)
    ctx, cancel := context.WithCancel(context.Background())
    r = r.WithContext(ctx)
    ch := make(chan bool)
    go func() {
        _, err := http.DefaultClient.Do(r)
        ch <- &canceledErr{err}
    }()
    cancel()
    log.Println((<-ch).Cancelled()) // Prints true
}

此解決方法建立一個自訂錯誤類型canceledErr,它嵌入包裝的錯誤並提供Cancelled() 方法來檢查上下文取消。

以上是Go 中如何檢查 HTTP 請求是否被取消?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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