Rumah >pembangunan bahagian belakang >Golang >Mengendalikan respons HTTP penstriman
Editor PHP Zimo memperkenalkan anda kepada kaedah memproses respons HTTP penstriman. Apabila membangunkan aplikasi web, kita selalunya perlu berurusan dengan memuat turun fail besar atau penghantaran media penstriman masa nyata. Kaedah tradisional memuatkan keseluruhan kandungan tindak balas sekaligus akan menyebabkan penggunaan memori yang berlebihan dan menjejaskan prestasi. Untuk menyelesaikan masalah ini, kami boleh menggunakan respons HTTP penstriman. Menstrim respons HTTP boleh menghantar kandungan respons dalam ketulan, mengurangkan penggunaan memori dan meningkatkan pengalaman pengguna. Dalam PHP, kami boleh menggunakan beberapa perpustakaan atau kaedah tersuai untuk melaksanakan penstriman respons HTTP untuk mengoptimumkan aplikasi web kami.
Saya mempunyai contoh berikut, yang bersambung kepada perkhidmatan HTTP yang menstrimkan respons kembali dalam ketulan untuk mencipta struktur JSON. Untuk setiap bahagian, kod saya menambahkan bait rb
数组和各个行。但是,我的问题是尝试在 rb
apabila selesai supaya saya boleh menyahkodnya.
Adakah saya kehilangan sesuatu yang jelas di sini?
package main import ( "bufio" "bytes" "fmt" "io" "net/http" ) func main() { body := []byte("test") resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() fmt.Printf("Status: [%s]\n", resp.Status) fmt.Println() //var rb []byte reader := bufio.NewReader(resp.Body) var rb []byte for { line, err := reader.ReadBytes('\n') if err != nil { if err == io.EOF { break } fmt.Printf("Error reading streamed bytes %v", err) } rb = append(rb, line...) fmt.Println(rb) } }
abaikan pepijat dalam program dan rb
selesaikan selepas gelung terganggu.
Program ini memang mempunyai pepijat:
Nampaknya matlamat anda adalah untuk menyerap keseluruhan tindak balas kepada rb
. Gunakan io.ReadAll untuk melakukan ini:
resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() rb, err := io.ReadAll(resp.Body) if err != nil { // handle error } var data SomeType err = json.Unmarshal(rb, &data) if err != nil { // handle error }
Jika anda ingin menyahkod badan tindak balas kepada JSON, cara yang lebih baik ialah membiarkan JSON penyahkod membaca badan respons:
resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() var data SomeType err := json.NewDecoder(resp.Body).Decode(&data)
Atas ialah kandungan terperinci Mengendalikan respons HTTP penstriman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!