Maison > développement back-end > Golang > Comment envoyer des données séquentiellement en morceaux à partir d'un serveur HTTP Go ?

Comment envoyer des données séquentiellement en morceaux à partir d'un serveur HTTP Go ?

Patricia Arquette
Libérer: 2024-11-29 04:30:08
original
756 Les gens l'ont consulté

How to Send Data Sequentially in Chunks from a Go HTTP Server?

Utiliser des morceaux pour envoyer des données de manière séquentielle à partir d'un serveur Go

Lors de la création d'un serveur HTTP dans Go, il peut être utile d'envoyer une réponse en morceaux, permettant aux données d'être envoyées progressivement au fur et à mesure de leur récupération. Cela permet aux clients de recevoir des données de manière séquentielle.

Cependant, si un client ne reçoit des morceaux qu'à la fin d'une durée prédéterminée, ou si Go définit automatiquement l'en-tête Content-Length, cela peut être frustrant. . Pour remédier à cela, nous devons approfondir les nuances des réponses HTTP fragmentées dans Go.

Tout d'abord, il est important de se rappeler que l'en-tête Transfer-Encoding est implicitement géré par l'éditeur de réponse HTTP de Go. Par conséquent, vous n'avez pas besoin de le définir explicitement.

La clé pour obtenir une livraison séquentielle de morceaux réside dans l'utilisation de Flusher.Flush(). En appelant cette méthode après l'écriture de chaque fragment, nous déclenchons un encodage « fragmenté » et envoyons les données au client. Cela garantit que le client reçoit chaque morceau dès qu'il est prêt.

Voici un exemple de mise en œuvre de cette technique :

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/", func(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")
        for i := 1; i <= 10; i++ {
            fmt.Fprintf(w, "Chunk #%d\n", i)
            flusher.Flush() // Trigger "chunked" encoding and send a chunk...
            time.Sleep(500 * time.Millisecond)
        }
    })

    log.Print("Listening on localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}
Copier après la connexion

En utilisant cette approche, vous pouvez vous assurer que votre serveur Go HTTP envoie des morceaux de manière séquentielle, permettant aux clients de recevoir des données en temps opportun. De plus, il est essentiel de se rappeler que http.ResponseWriters prend en charge l'accès simultané pour une utilisation par plusieurs goroutines. Cela vous permet d'envoyer des morceaux de différents threads ou goroutines si nécessaire.

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