Maison >développement back-end >Golang >Comment diffuser des réponses HTTP fragmentées de manière incrémentielle dans Go ?

Comment diffuser des réponses HTTP fragmentées de manière incrémentielle dans Go ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-10 01:26:12206parcourir

How to Stream Chunked HTTP Responses Incrementally in Go?

Diffusion en continu de réponses HTTP fragmentées dans Go

Énoncé du problème :

Lors de la mise en œuvre d'un protocole Go HTTP serveur qui envoie des réponses fragmentées, le serveur fournit systématiquement tous les fragments à la fin d'une durée spécifiée au lieu de les envoyer de manière incrémentielle. De plus, Go inclut automatiquement l'en-tête Content-Length avec une valeur supérieure à zéro, même lorsque le contenu n'est pas connu à l'avance.

Solution :

Pour activer l'incrémentation l'envoi de morceaux et évitez de définir l'en-tête Content-Length prématurément, suivez ces étapes :

  1. Éliminez le codage de transfert En-tête : Go gère automatiquement l'en-tête Transfer-Encoding lorsque l'auteur envoie des réponses fragmentées. Par conséquent, il n'est pas nécessaire de le définir explicitement.
  2. Embrace Flush : Pour vider chaque morceau immédiatement après l'avoir écrit dans le flux de réponse, utilisez http.ResponseWriter.Flush(). Cela déclenchera l'encodage fragmenté et enverra le fragment sans attendre la fin de la réponse.

Exemple de code :

package main

import (
    "fmt"
    "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()
            time.Sleep(500 * time.Millisecond)
        }
    })

    log.Print("Listening on localhost:8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Vérification :

Tester le serveur à l'aide de Telnet affichera les morceaux envoyés progressivement :

$ 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 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