Heim >Backend-Entwicklung >Golang >Wie sende ich Daten sequentiell in Blöcken von einem Go-HTTP-Server?

Wie sende ich Daten sequentiell in Blöcken von einem Go-HTTP-Server?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-29 04:30:08757Durchsuche

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

Verwenden von Chunks zum sequentiellen Senden von Daten von einem Go-Server

Beim Erstellen eines HTTP-Servers in Go kann es nützlich sein, eine Antwort zu senden in Blöcken, sodass Daten nach und nach gesendet werden können, während sie abgerufen werden. Dadurch können Clients Daten sequentiell empfangen.

Wenn ein Client jedoch nur Blöcke am Ende einer vorgegebenen Dauer empfängt oder Go den Content-Length-Header automatisch festlegt, kann dies frustrierend sein . Um dies zu beheben, müssen wir uns mit den Nuancen von Chunk-HTTP-Antworten in Go befassen.

Zunächst ist es wichtig, sich daran zu erinnern, dass der Transfer-Encoding-Header implizit vom HTTP-Antwortschreiber von Go verarbeitet wird. Daher müssen Sie es nicht explizit festlegen.

Der Schlüssel zur sequentiellen Bereitstellung von Blöcken liegt in der Verwendung von Flusher.Flush(). Indem wir diese Methode aufrufen, nachdem jeder Block geschrieben wurde, lösen wir eine „Chunked“-Codierung aus und senden die Daten an den Client. Dadurch wird sichergestellt, dass der Client jeden Block erhält, sobald er bereit ist.

Hier ist ein Beispiel für die Implementierung dieser Technik:

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

Mit diesem Ansatz können Sie sicherstellen, dass Ihr Go-HTTP-Server sendet Blöcke nacheinander, sodass Clients Daten rechtzeitig empfangen können. Darüber hinaus ist es wichtig zu bedenken, dass http.ResponseWriters den gleichzeitigen Zugriff für die Verwendung durch mehrere Goroutinen unterstützen. Dadurch können Sie bei Bedarf Chunks aus verschiedenen Threads oder Goroutinen senden.

Das obige ist der detaillierte Inhalt vonWie sende ich Daten sequentiell in Blöcken von einem Go-HTTP-Server?. 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