Maison > développement back-end > Golang > Comment vérifier si une requête HTTP a été annulée dans Go ?

Comment vérifier si une requête HTTP a été annulée dans Go ?

DDD
Libérer: 2024-11-07 14:54:03
original
426 Les gens l'ont consulté

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

Comment vérifier si une demande a été annulée

Contexte et annulation

Dans Go, les contextes fournissent un mécanisme de contrôle et d'annulation des opérations. Ils permettent de propager des signaux d'annulation via des goroutines et des requêtes HTTP.

Le problème

Lors de l'utilisation de requêtes HTTP avec un contexte, il est crucial de gérer correctement l'annulation. Dans Go 1.9, tenter de vérifier si une demande a été annulée à l'aide de err == context.Canceled peut entraîner des résultats incorrects.

Solution

Dans Go 1.13 :

La méthode préférée pour vérifier l'annulation est d'utiliser la nouvelle fonction error.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
Copier après la connexion

errors.Is vérifie la chaîne d'erreurs et renvoie true si une erreur dans la chaîne correspond au contexte fourni. .Erreur annulée.

Dans Go 1.9-1.12 :

Pour les versions antérieures de Go, vous pouvez utiliser la solution de contournement suivante :

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

Cette solution de contournement crée un type d'erreur personnalisé CancelErr qui intègre l'erreur encapsulée et fournit une méthode Cancelled() pour vérifier l'annulation du contexte.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal