Maison  >  Article  >  développement back-end  >  Comment détecter l’annulation d’une demande dans Go ?

Comment détecter l’annulation d’une demande dans Go ?

DDD
DDDoriginal
2024-11-07 18:23:02442parcourir

How to Detect Request Cancellation in Go?

Détection de l'annulation d'une demande dans Go

Dans Go, vérifier si une requête HTTP a été annulée peut se faire de plusieurs manières. L'extrait de code fournissait des tentatives pour vérifier l'annulation en inspectant l'erreur renvoyée par http.DefaultClient.Do(), mais il enregistre de manière inattendue false.

Solution pour Go 1.13

Pour les versions Go 1.13 et supérieures, l’approche recommandée consiste à exploiter la fonction error.Is. Cette fonction vous permet de vérifier si une erreur correspond à un type spécifique, y compris les erreurs du package de contexte.

// Create a canceled context
ctx, cancel := context.WithCancel(context.Background())
cancel()

// Create a request with the canceled context
r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

// Attempt the request, which will fail immediately due to the canceled context
_, err := http.DefaultClient.Do(r)

// Validate the error's origin using errors.Is
if errors.Is(err, context.Canceled) {
    fmt.Println("Request canceled!")
}

Dans ce cas, error.Is déterminera avec précision que l'erreur provient du contexte annulé, confirmant ainsi que la demande a bien été annulée.

Approche alternative

Avant Go 1.13, vous pouvez utiliser une combinaison de grpc.ErrorDesc et context.Err() pour vérifier l'annulation :

// Create a canceled context
ctx, cancel := context.WithCancel(context.Background())
cancel()

// Create a request with the canceled context
r, _ := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)

// Attempt the request, which will fail immediately due to the canceled context
_, err := http.DefaultClient.Do(r)

// Check for a canceled context error
if grpc.ErrorDesc(err) == context.Canceled {
    fmt.Println("Request canceled!")
}

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!

Déclaration:
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