Apabila bekerja dengan Go-chi untuk penghalaan HTTP, selalunya perlu menggunakan semula badan permintaan merentas berbilang pengendali. Walau bagaimanapun, cabaran biasa timbul apabila badan permintaan hanya boleh dibaca sekali.
Sebagai contoh, pertimbangkan kod berikut:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // read request body // ...other code user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code }
Dalam contoh ini, pengendali Pendaftaran membaca badan permintaan menggunakan ioutil.ReadAll. Apabila pengendali Cipta digunakan, ia cuba membaca semula kandungan, mengakibatkan ralat input JSON yang tidak dijangka.
Masalah asas di sini ialah panggilan pertama ke ReadAll meletihkan badan permintaan. Untuk menyelesaikan isu ini, badan permintaan mesti dipulihkan dengan data yang dibaca sebelum ini. Kod berikut menunjukkan cara:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := io.ReadAll(r.Body) // ...other code r.Body = io.NopCloser(bytes.NewReader(b)) user.Create(w, r) }
Dalam kod yang disemak ini, io.ReadAll digunakan untuk membaca badan permintaan, dan kemudian badan permintaan dipulihkan dengan bait.NewReader dan io.NopCloser berfungsi sebelum memanggil pengguna.Buat. Ini dengan berkesan menjadikan badan permintaan tersedia untuk pengendali seterusnya.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Semula Badan Permintaan HTTP dalam Perisian Tengah Go-chi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!