Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Semak sama ada Permintaan HTTP Dibatalkan dalam Go?

Bagaimana untuk Semak sama ada Permintaan HTTP Dibatalkan dalam Go?

DDD
DDDasal
2024-11-07 14:54:03422semak imbas

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

Cara Semak jika Permintaan Dibatalkan

Konteks dan Pembatalan

Dalam Go, konteks menyediakan mekanisme untuk mengawal dan membatalkan operasi. Mereka membenarkan untuk menyebarkan isyarat pembatalan melalui goroutines dan permintaan HTTP.

Masalahnya

Apabila menggunakan permintaan HTTP dengan konteks, adalah penting untuk mengendalikan pembatalan dengan betul. Dalam Go 1.9, cuba menyemak sama ada permintaan telah dibatalkan menggunakan konteks err ==. Dibatalkan boleh mengakibatkan hasil yang salah.

Penyelesaian

In Go 1.13 :

Cara pilihan untuk menyemak pembatalan adalah dengan menggunakan ralat baharu. Fungsi Is:

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

ralat. Is menyemak rantaian ralat dan mengembalikan benar jika sebarang ralat dalam rantai sepadan dengan konteks yang disediakan .Ralat dibatalkan.

In Go 1.9-1.12:

Untuk versi Go yang terdahulu, anda boleh menggunakan penyelesaian berikut:

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
}

Penyelesaian ini mencipta jenis ralat tersuai canceledErr yang membenamkan ralat yang dibalut dan menyediakan kaedah Cancelled() untuk menyemak pembatalan konteks.

Atas ialah kandungan terperinci Bagaimana untuk Semak sama ada Permintaan HTTP Dibatalkan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn