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() }
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!