Réponse HTTP fragmentée continue du serveur Go
Dans le but de créer un serveur HTTP Go qui transmet en continu des morceaux de données, vous avez rencontré un défi. Au lieu de recevoir des fragments comme prévu chaque seconde, votre client ne reçoit la réponse complète qu'après une durée de 5 secondes. De plus, vous cherchez à envoyer l'en-tête Content-Length à 0 à la fin de la transmission.
Pour résoudre ce problème, il est essentiel d'intégrer l'interface Flusher dans l'implémentation de votre serveur. Voici une version modifiée de votre code :
package main import ( "fmt" "io" "log" "net/http" "time" ) func main() { http.HandleFunc("/test", HandlePost) log.Fatal(http.ListenAndServe(":8080", nil)) } func HandlePost(w http.ResponseWriter, r *http.Request) { flusher, ok := w.(http.Flusher) if !ok { panic("expected http.ResponseWriter to be an http.Flusher") } w.Header().Set("X-Content-Type-Options", "nosniff") ticker := time.NewTicker(time.Second) go func() { for t := range ticker.C { io.WriteString(w, "Chunk") fmt.Println("Tick at", t) flusher.Flush() } }() time.Sleep(time.Second * 5) ticker.Stop() fmt.Println("Finished: should return Content-Length: 0 here") w.Header().Set("Content-Length", "0") }
En appelant Flusher.Flush() après l'écriture de chaque fragment, vous déclenchez l'encodage « fragmenté » et envoyez des fragments individuels. Cela garantit que le client reçoit les données dès qu'elles deviennent disponibles.
La vérification de ce comportement peut être réalisée via telnet, comme démontré ci-dessous :
$ telnet localhost 8080 Trying ::1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.1 HTTP/1.1 200 OK Date: Tue, 02 Jun 2015 18:16:38 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked 9 Chunk #1 9 Chunk #2 ...
Ce code modifié permet d'envoyer une réponse HTTP en bloc continu. depuis votre serveur Go. N'oubliez pas de vérifier que vos ResponseWriters prennent en charge l'accès simultané sur plusieurs goroutines pour des performances optimales.
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!