Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Menggunakan Semula Badan Permintaan HTTP dalam Pengendali Perisian Tengah Go?

Bagaimanakah Saya Boleh Menggunakan Semula Badan Permintaan HTTP dalam Pengendali Perisian Tengah Go?

Susan Sarandon
Lepaskan: 2024-12-05 11:19:10
asal
354 orang telah melayarinya

How Can I Reuse an HTTP Request Body in Go Middleware Handlers?

Menggunakan Semula Badan Permintaan HTTP dalam Pengendali Perisian Tengah Go

Dalam pakej net/http Go, pengendali perisian tengah menyediakan cara yang mudah untuk memproses dan mengubah suai masuk Permintaan HTTP sebelum dikendalikan oleh kod aplikasi sebenar. Walau bagaimanapun, cabaran biasa timbul apabila pengendali perisian tengah perlu menggunakan semula badan permintaan yang telah dibaca oleh pengendali sebelumnya.

Pertimbangkan coretan kod 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
}
Salin selepas log masuk

Dalam senario ini , pengendali Pendaftaran membaca badan permintaan ke dalam pembolehubah b dan menyerahkan permintaan r kepada pengguna. Buat pengendali, yang cuba membaca badan lagi. Walau bagaimanapun, ini mengakibatkan ralat kerana badan telah digunakan oleh pengendali Pendaftaran.

Penyelesaian untuk isu ini adalah mudah: pulihkan badan permintaan di pengendali luar selepas ia dibaca. Ini boleh dicapai menggunakan fungsi bytes.NewReader() dan io.NopCloser:

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)
}
Salin selepas log masuk

Fungsi bytes.NewReader() mencipta io.Reader daripada kepingan bait dan io.NopCloser menukar io .Pembaca kepada jenis io.ReadCloser yang diperlukan untuk r.Body. Dengan memulihkan badan, pengendali seterusnya boleh mengakses data permintaan asal.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Semula Badan Permintaan HTTP dalam Pengendali Perisian Tengah Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan