Maison > développement back-end > Golang > Comment puis-je annuler une requête HTTP à interrogation longue dans Go ?

Comment puis-je annuler une requête HTTP à interrogation longue dans Go ?

Linda Hamilton
Libérer: 2024-12-01 00:10:15
original
915 Les gens l'ont consulté

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

Annuler une demande d'interrogation longue dans Golang

Lors de la mise en œuvre d'une interrogation longue côté client à l'aide de http.Client, il est souvent souhaitable avoir la possibilité d’annuler la demande prématurément. Cela pourrait être réalisé en appelant manuellement resp.Body.Close() à partir d'une goroutine distincte, mais ce n'est pas une solution standard et élégante.

Annulation à l'aide du contexte de demande

Une manière plus idiomatique d'annuler une requête HTTP dans Golang consiste à utiliser le contexte de requête. En passant un contexte avec une date limite ou une fonction d'annulation, la demande peut être annulée côté client. Le code suivant montre comment utiliser le contexte de requête pour annuler une requête d'interrogation longue :

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()
}
Copier après la connexion

Lorsque la fonction Cancel() est appelée, la requête sera annulée et les Dial et TLSHandshakeTimeout spécifiés dans le transport sera respecté.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal