Wie überprüfe ich, ob eine HTTP-Anfrage in Go abgebrochen wurde?

DDD
Freigeben: 2024-11-07 14:54:03
Original
343 Leute haben es durchsucht

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

So überprüfen Sie, ob eine Anfrage storniert wurde

Kontext und Stornierung

In Go bieten Kontexte einen Mechanismus zum Steuern und Abbrechen von Vorgängen. Sie ermöglichen die Weitergabe von Abbruchsignalen über Goroutinen und HTTP-Anfragen.

Das Problem

Bei der Verwendung von HTTP-Anfragen mit einem Kontext ist es entscheidend, den Abbruch korrekt zu handhaben. In Go 1.9 kann der Versuch, mit err == context.Canceled zu überprüfen, ob eine Anfrage abgebrochen wurde, zu falschen Ergebnissen führen.

Lösung

In Go 1.13:

Die bevorzugte Methode zur Überprüfung auf Abbruch ist die Verwendung der neuen Funktion „errors.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
Nach dem Login kopieren

errors.Is überprüft die Fehlerkette und gibt „true“ zurück, wenn ein Fehler in der Kette mit dem bereitgestellten Kontext übereinstimmt .Fehler behoben.

In Go 1.9-1.12:

Für frühere Versionen von Go können Sie die folgende Problemumgehung verwenden:

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
}
Nach dem Login kopieren

Diese Problemumgehung erstellt einen benutzerdefinierten Fehlertyp cancelledErr, der den umschlossenen Fehler einbettet und eine Cancelled()-Methode zur Prüfung auf Kontextabbruch bereitstellt.

Das obige ist der detaillierte Inhalt vonWie überprüfe ich, ob eine HTTP-Anfrage in Go abgebrochen wurde?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!