Panduan ini menangani isu penimbalan dalam pengendalian respons HTTP Go, di mana respons biasanya ditimbal dan dihantar dalam blok ke pelanggan selepas permintaan diproses. Untuk senario penstriman, ini mungkin tidak diingini.
Coretan kod yang disediakan menggambarkan masalah, di mana dua baris data sepatutnya distrim tetapi sebaliknya dihantar serentak disebabkan penimbalan.
Satu pendekatan untuk menangani perkara ini ialah dengan mengepam penimbal tindak balas secara eksplisit. ResponseWriter Go menyediakan kaedah Flush, tetapi ketersediaannya bergantung pada pelaksanaan tertentu.
Sebagai contoh, kod yang diubah suai berikut menggabungkan pembilasan:
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") }
Dalam senario tertentu, seperti menstrim output arahan luaran, curahan terus mungkin tidak mencukupi. Mekanisme paip Go membolehkan penstriman terus antara output arahan dan penulis respons.
Berikut ialah contoh pelaksanaan:
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 } } }
Untuk lebih fleksibiliti , adalah mungkin untuk menggunakan TCP Hijacker, yang memberikan kawalan langsung ke atas sambungan TCP. Walau bagaimanapun, pendekatan ini memerlukan pemahaman yang lebih mendalam tentang pengaturcaraan rangkaian dan kurang disyorkan untuk kes penggunaan umum.
Perhatikan bahawa penimbalan mungkin masih berlaku dalam komponen rangkaian atau dalam aplikasi klien, jadi ia adalah penting untuk menilai kes penggunaan khusus anda untuk menentukan keperluan untuk pembilasan yang jelas atau penyelesaian alternatif.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menstrim Respons HTTP di Golang dan Mengelakkan Penimbalan Lalai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!