Respons HTTP Chunked Berterusan daripada Pelayan Go
Dalam usaha untuk mencipta pelayan HTTP Go yang menghantar cebisan data secara berterusan, anda telah menghadapi cabaran. Daripada menerima potongan seperti yang dimaksudkan setiap saat, pelanggan anda hanya menerima keseluruhan respons selepas tempoh 5 saat. Selain itu, anda ingin menghantar pengepala Panjang Kandungan sebagai 0 pada penghujung penghantaran.
Untuk menyelesaikan isu ini, adalah penting untuk menyepadukan antara muka Flusher ke dalam pelaksanaan pelayan anda. Berikut ialah versi kod anda yang dipinda:
package main import ( "fmt" "io" "log" "net/http" "time" ) func main() { http.HandleFunc("/test", HandlePost) log.Fatal(http.ListenAndServe(":8080", nil)) } func HandlePost(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") ticker := time.NewTicker(time.Second) go func() { for t := range ticker.C { io.WriteString(w, "Chunk") fmt.Println("Tick at", t) flusher.Flush() } }() time.Sleep(time.Second * 5) ticker.Stop() fmt.Println("Finished: should return Content-Length: 0 here") w.Header().Set("Content-Length", "0") }
Dengan menggunakan Flusher.Flush() selepas setiap bahagian ditulis, anda mencetuskan pengekodan "chunked" dan menghantar potongan individu. Ini memastikan pelanggan menerima data apabila ia tersedia.
Mengesahkan tingkah laku ini boleh dicapai melalui telnet, seperti yang ditunjukkan di bawah:
$ 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 ...
Kod yang diubah suai ini membolehkan penghantaran respons HTTP Chunked Berterusan daripada pelayan Go anda. Ingat untuk mengesahkan bahawa ResponseWriters anda menyokong akses serentak merentas berbilang goroutine untuk prestasi optimum.
Atas ialah kandungan terperinci Mengapa Pelayan HTTP My Go Hanya Menghantar Data Potongan Selepas Kelewatan, dan Bagaimana Saya Boleh Menetapkan Panjang Kandungan kepada 0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!