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.
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:]) }
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!