Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menggunakan Semula Data Badan Permintaan HTTP Merentasi Pengendali Perisian Tengah Go-chi?
Menggunakan Semula Badan Permintaan HTTP dalam Pengendali Perisian Tengah Go-chi
Apabila menggunakan go-chi untuk penghalaan HTTP, adalah mudah untuk menggunakan semula kod dalam berbilang pengendali. Walau bagaimanapun, ini boleh membawa kepada isu yang tidak dijangka jika pengendali bergantung pada data badan permintaan.
Pertimbangkan senario berikut:
func Registration(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created // ...other code // if all good then create new user user.Create(w, r) } ... func Create(w http.ResponseWriter, r *http.Request) { b, err := ioutil.ReadAll(r.Body) // ...other code // ... there I get the problem with parse JSON from &b }
Dalam contoh ini, kedua-dua pengendali Pendaftaran dan Buat cuba membaca badan permintaan menggunakan ioutil.ReadAll. Walau bagaimanapun, memandangkan Pendaftaran membaca kandungan sehingga penghujungnya, tiada data lagi untuk dibaca apabila Cipta dipanggil.
Untuk menyelesaikan isu ini, pengendali luar (Pendaftaran) mesti memulihkan badan permintaan dengan data dibaca sebelum ini. Ini boleh dicapai menggunakan kod berikut:
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) }
Di sini, fungsi bytes.NewReader() mengembalikan io.Reader pada kepingan bait, manakala fungsi io.NopCloser menukarkan pembaca ini kepada io. Antara muka ReadCloser diperlukan untuk r.Body. Dengan menetapkan semula r.Body dengan data asal, Create kini boleh mengakses dan menghuraikan kandungan permintaan seperti yang diharapkan.
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan Semula Data Badan Permintaan HTTP Merentasi Pengendali Perisian Tengah Go-chi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!