Heim >Backend-Entwicklung >Golang >Wie streame ich geblockte HTTP-Antworten inkrementell in Go?

Wie streame ich geblockte HTTP-Antworten inkrementell in Go?

Susan Sarandon
Susan SarandonOriginal
2024-12-10 01:26:12210Durchsuche

How to Stream Chunked HTTP Responses Incrementally in Go?

Chunked HTTP-Antworten in Go streamen

Problemstellung:

Bei der Implementierung eines Go-HTTP Server, der geblockte Antworten sendet, stellt der Server alle Blöcke am Ende einer bestimmten Dauer konsistent zu, anstatt sie inkrementell zu senden. Darüber hinaus fügt Go automatisch den Content-Length-Header mit einem Wert größer als Null ein, auch wenn der Inhalt nicht im Voraus bekannt ist.

Lösung:

Zur Aktivierung der Inkrementierung Um das Senden von Chunks zu verhindern und das vorzeitige Setzen des Content-Length-Headers zu vermeiden, befolgen Sie diese Schritte:

  1. Eliminieren Sie Transfer-Encoding Header: Go verarbeitet automatisch den Transfer-Encoding-Header, wenn der Autor geblockte Antworten sendet. Daher besteht keine Notwendigkeit, es explizit festzulegen.
  2. Embrace Flush: Um jeden Block sofort nach dem Schreiben in den Antwortstream zu leeren, verwenden Sie http.ResponseWriter.Flush(). Dadurch wird die Chunk-Codierung ausgelöst und der Chunk gesendet, ohne auf den Abschluss der Antwort zu warten.

Beispielcode:

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

Überprüfung:

Beim Testen des Servers mit Telnet werden Chunks angezeigt, die gesendet werden schrittweise:

$ 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

...

Das obige ist der detaillierte Inhalt vonWie streame ich geblockte HTTP-Antworten inkrementell in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn