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
Patricia Arquetteoriginal
2024-11-29 04:30:08674parcourir

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))
}

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!

Déclaration:
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