Maison > développement back-end > Golang > Comment Go peut-il gérer les annulations de clients dans les requêtes HTTP avec des corps ?

Comment Go peut-il gérer les annulations de clients dans les requêtes HTTP avec des corps ?

Mary-Kate Olsen
Libérer: 2024-12-07 00:50:11
original
865 Les gens l'ont consulté

How Can Go Handle Client Cancellations in HTTP Requests with Bodies?

Annulation de client avec les corps de requête HTTP dans Go

Lors du traitement des requêtes HTTP, il est important de pouvoir répondre aux signaux d'annulation du client pour un traitement gracieux gestion des ressources. Bien que le package contextuel de Go fournisse un mécanisme pour capturer l'annulation, il peut ne pas se comporter comme prévu dans certains scénarios.

Pourquoi les requêtes GET et POST diffèrent

La différence de comportement entre GET et les requêtes POST proviennent de la façon dont les requêtes sont traitées par HTTP serveur.

  • GET : Les requêtes GET n'ont pas de corps de requête, le serveur peut donc commencer à traiter la requête immédiatement.
  • POST : Les requêtes POST ont un corps de requête, et le serveur doit attendre de recevoir le corps complet avant de traiter le demande.

Capturer l'annulation avec les corps de la demande

Pour capturer les signaux d'annulation des demandes avec des corps, il est crucial de commencer à lire le corps de la demande rapidement. Le serveur http de Go vérifie uniquement les connexions fermées lorsque l'application lit le corps de la requête.

Solution :

Pour garantir que les signaux d'annulation sont capturés le plus tôt possible, modifiez le gestionnaire de requêtes pour commencer à lire le corps de la requête immédiatement :

func handler(w http.ResponseWriter, r *http.Request) {
    go func(done <-chan struct{}) {
        <-done
        fmt.Println("message", "client connection has gone away, request got cancelled")
    }(r.Context().Done())

    io.Copy(ioutil.Discard, r.Body) // Read the body to detect closed connections
    time.Sleep(30 * time.Second)
    fmt.Fprintf(w, "Hi there, I love %s!\n", r.URL.Path[1:])
}
Copier après la connexion

Cette solution commencera à lire le corps de la requête et vérifiera simultanément les connexions fermées, permettant ainsi la capture de l'annulation. signaux quel que soit le type de demande.

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