Heim >Backend-Entwicklung >Golang >Wie kann ich eine HTTP-Anfrage mit langem Polling in Go abbrechen?

Wie kann ich eine HTTP-Anfrage mit langem Polling in Go abbrechen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-01 00:10:15919Durchsuche

How Can I Cancel a Long-Polling HTTP Request in Go?

Abbrechen einer Long-Polling-Anfrage in Golang

Bei der Implementierung einer clientseitigen Long-Polling-Anfrage mit http.Client ist dies oft wünschenswert um die Möglichkeit zu haben, die Anfrage vorzeitig abzubrechen. Dies könnte durch den manuellen Aufruf von resp.Body.Close() aus einer separaten Goroutine erreicht werden, ist aber keine standardmäßige und elegante Lösung.

Stornierung mithilfe des Anforderungskontexts

Eine idiomatischere Möglichkeit, eine HTTP-Anfrage in Golang abzubrechen, ist die Verwendung des Anfragekontexts. Durch die Übergabe eines Kontexts mit einer Frist oder einer Abbruchfunktion kann die Anfrage von der Client-Seite abgebrochen werden. Der folgende Code zeigt, wie der Anforderungskontext zum Abbrechen einer langen Abfrageanforderung verwendet wird:

import (
    "context"
    "net/http"
)

func main() {
    // Create a new HTTP client with a custom transport.
    client := &http.Client{
        Transport: &http.Transport{
            // Set a timeout for the request.
            Dial: (&net.Dialer{Timeout: 5 * time.Second}).Dial,
            TLSHandshakeTimeout: 5 * time.Second,
        },
    }

    // Create a new request with a context that can be cancelled.
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

    req, err := http.NewRequest("POST", "http://example.com", nil)
    if err != nil {
        panic(err)
    }
    req = req.WithContext(ctx)

    // Start the request in a goroutine and cancel it after 5 seconds.
    go func() {
        _, err := client.Do(req)
        if err != nil {
            // Handle the canceled error.
        }
    }()

    time.Sleep(5 * time.Second)
    cancel()
}

Wenn die Funktion cancel() aufgerufen wird, wird die Anforderung abgebrochen und die im Transport angegebenen Dial- und TLSHandshakeTimeout-Werte werden festgelegt wird respektiert.

Das obige ist der detaillierte Inhalt vonWie kann ich eine HTTP-Anfrage mit langem Polling in Go abbrechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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