„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum sendet GO -HTTP -Server nicht schrittweise Antworten?

Warum sendet GO -HTTP -Server nicht schrittweise Antworten?

Gepostet am 2025-04-14
Durchsuche:818

Why Doesn't My Go HTTP Server Send Chunked Responses Progressively?

http thunks antworten von a go server

In diesem Szenario wollen wir einen Go-Http-Server erstellen, der eine HTTP-Antwort mit dem Transfer-Cododing-Set sendet. Der Server beabsichtigt, Teile in Intervallen von ein Sekunde zu schreiben, sodass der Client diese auf Bedarf empfangen kann. Die aktuelle Implementierung steht jedoch vor Herausforderungen:

  1. Der Kunde empfängt alle Teile gleichzeitig anstatt progressiv wie beabsichtigt. Bereitstellung Servercode lautet wie folgt:
  2. func handlePost (w http.responsewriter, r *http.request) { W.Header (). Set ("Verbindung", "Keep-Alive") W.Header (). Set ("Transfer-Coding", "Chunked") W.Header (). Set ("X-In-In-In-In-In-in-Typ-Optionen", "Nosniff") Ticker: = time.newticker (time.second) go func () { für t: = Bereich Ticker.c { io.writestring (W, "Chunk") fmt.println ("tick at", t) } } ()) time.sleep (time.second * 5) Ticker.Stop () fmt.println ("Fertig: Sollte die Inhaltslänge zurückgeben: 0 hier") W.Header (). Set ("Inhaltslänge", "0") }

Lösung

, um die Probleme zu beheben:

func HandlePost(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Connection", "Keep-Alive")
    w.Header().Set("Transfer-Encoding", "chunked")
    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)
        }
    }()
    time.Sleep(time.Second * 5)
    ticker.Stop()
    fmt.Println("Finished: should return Content-Length: 0 here")
    w.Header().Set("Content-Length", "0")
}

Der Übertragungs-kodierende Header wird automatisch vom Http-Schriftsteller verwaltet. Es ist also unnötig, sie ausdrücklich zu setzen. "fmt" "io" "Protokoll" "net/http" "Zeit" ) func main () { http.handlefunc ("/", func (w http.responsewriter, r *http.request) { Flusher, OK: = w. (http.flusher) If! OK { Panik ("erwartete http.responsewriter als http.flusher") } W.Header (). Set ("X-In-In-In-In-In-in-Typ-Optionen", "Nosniff") für i: = 1; i

verifikation

    verwenden Telnet, um eine Verbindung zum Server herzustellen:
  1. $ telnet localhost 8080 ... HTTP/1.1 200 OK Datum: ... Inhaltstyp: Text/Ebene; charset = utf-8 Transfer-Codierung: Chunked 9 Chunk #1 9 Chunk #2 ...
  2. Jeder Chunk wird progressiv empfangen, wenn der Server sie sendet.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3