Menghantar Data Masa Nyata dengan Respons HTTP Tanpa Penimbalan dalam Go
Dalam Go, respons HTTP lazimnya ditimbal sebelum dihantar kepada pelanggan. Walau bagaimanapun, untuk aplikasi penstriman atau masa nyata, adalah penting untuk menghantar data secara berperingkat tanpa penimbalan.
Untuk mencapai respons tanpa penimbalan, anda boleh memanfaatkan antara muka Flusher yang dilaksanakan oleh sesetengah ResponseWriter. Dengan membuang respons selepas setiap operasi tulis, anda boleh menghantar data terus kepada pelanggan apabila ia tersedia. Berikut ialah contoh:
func handle(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "sending first line of data") if f, ok := res.(http.Flusher); ok { f.Flush() } sleep(10) // Not real code fmt.Fprintf(res, "sending second line of data") }
Walaupun pendekatan ini berfungsi untuk penulisan manual, pendekatan ini mungkin tidak mencukupi untuk output arahan paip atau senario lain apabila data datang secara tidak segerak. Dalam kes sedemikian, anda boleh menggunakan rutin Go untuk membaca dan mengepam data secara berterusan.
pipeReader, pipeWriter := io.Pipe() cmd.Stdout = pipeWriter cmd.Stderr = pipeWriter go writeCmdOutput(res, pipeReader) err := cmd.Run() pipeWriter.Close() func writeCmdOutput(res http.ResponseWriter, pipeReader *io.PipeReader) { buffer := make([]byte, BUF_LEN) for { n, err := pipeReader.Read(buffer) if err != nil { pipeReader.Close() break } data := buffer[0:n] res.Write(data) if f, ok := res.(http.Flusher); ok { f.Flush() } // Reset buffer for i := 0; i < n; i++ { buffer[i] = 0 } } }
Pendekatan ini memastikan bahawa output arahan ditulis dan dipadamkan terus kepada klien tanpa penimbalan. Untuk kemudahan selanjutnya, pertimbangkan untuk menggunakan perpustakaan seperti [fasthttp](https://github.com/valyala/fasthttp) yang menyediakan sokongan terbina dalam untuk penstriman masa nyata.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghantar Data Masa Nyata dengan Respons HTTP Tidak Dibuffer dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!