Streaming des réponses HTTP dans Go : désactiver la mise en mémoire tampon dans http.ResponseWriter
Le streaming des réponses HTTP permet d'envoyer des données au client de manière incrémentielle, plutôt que d'attendre que la totalité de la demande soit traitée. Cette approche améliore l'expérience utilisateur en fournissant un retour immédiat et en réduisant la latence perçue. Dans Go, l'interface http.ResponseWriter est chargée d'envoyer les réponses au client. Cependant, par défaut, il met les données en mémoire tampon jusqu'à ce que la requête soit terminée.
Solution : utiliser l'interface Flusher
Pour désactiver la mise en mémoire tampon et diffuser les réponses, nous pouvons exploiter le Flusher interface implémentée par certains types ResponseWriter. L'interface Flusher nous permet de vider manuellement toutes les données mises en mémoire tampon vers le client.
import ( "fmt" "log" "net/http" "time" ) func handle(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "sending first line of data") // Check if ResponseWriter implements Flusher interface if f, ok := res.(http.Flusher); ok { f.Flush() } else { log.Println("Damn, no flush") } time.Sleep(10 * time.Second) // Simulate a delay fmt.Fprintf(res, "sending second line of data") }
En incorporant l'interface Flusher, nous pouvons explicitement vider les données mises en mémoire tampon après avoir écrit chaque morceau de la réponse. Cela garantit que les données sont envoyées immédiatement au client, ce qui entraîne une réponse en continu.
Solution alternative : détourner la connexion
Une autre approche consiste à détourner le TCP sous-jacent. connexion de la requête HTTP. Cela permet une interaction directe avec le socket et une personnalisation du processus de transfert de données, y compris la désactivation de la mise en mémoire tampon. Cependant, cette approche est plus complexe et nécessite une compréhension plus approfondie de la couche réseau sous-jacente.
Autoflushing : pas une fonctionnalité intégrée
Malheureusement, le http.ResponseWriter de Go ne fournit pas de fonction de rinçage automatique. Cela signifie que le développeur est responsable de vider manuellement les données si nécessaire. Cependant, certains frameworks ou bibliothèques tierces peuvent offrir des fonctionnalités de rinçage automatique.
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!