Maison > développement back-end > Golang > Pourquoi mon serveur HTTP Go n'envoie-t-il des données fragmentées qu'après un délai et comment puis-je définir la longueur du contenu sur 0 ?

Pourquoi mon serveur HTTP Go n'envoie-t-il des données fragmentées qu'après un délai et comment puis-je définir la longueur du contenu sur 0 ?

Barbara Streisand
Libérer: 2024-12-04 08:12:13
original
400 Les gens l'ont consulté

Why Does My Go HTTP Server Only Send Chunked Data After a Delay, and How Can I Set Content-Length to 0?

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")
}
Copier après la connexion

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

...
Copier après la connexion

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!

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