Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memeriksa Badan Permintaan HTTP Tanpa Kehilangan Data untuk Pengendali Seterusnya?

Bagaimanakah Saya Boleh Memeriksa Badan Permintaan HTTP Tanpa Kehilangan Data untuk Pengendali Seterusnya?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 01:27:14522semak imbas

How Can I Inspect an HTTP Request Body Without Losing Data for Subsequent Handlers?

Memelihara Keadaan Permintaan Semasa Memeriksa Badan dengan HTTP.Handler

Dalam konteks melaksanakan pengendali HTTP, mengakses badan permintaan menggunakan kaedah seperti req.ParseForm() boleh mencipta dilema. Walaupun pemeriksaan sedemikian selalunya diperlukan, ia boleh menghabiskan aliran badan permintaan, menjadikannya tidak boleh digunakan untuk pengendali berikutnya (cth., proksi terbalik).

Masalah: Aliran Badan yang Terkuras

Apabila badan permintaan digunakan dengan kaedah panggilan seperti req.ParseForm(), Strim req.Body.Reader telah dikeringkan, tidak meninggalkan data yang tinggal untuk pengendali hiliran. Ini mengakibatkan ralat semasa pemajuan proksi, kerana panjang badan permintaan yang dijangka tidak lagi sepadan dengan keadaan habis.

Penyelesaian: Split the Body Stream

Untuk mengatasi cabaran ini , teknik yang melibatkan lapisan penimbal boleh digunakan. Dengan membaca kandungan permintaan ke dalam penimbal dan menggunakan penimbal itu untuk mencipta berbilang pembaca baharu, kami boleh memisahkan pemeriksaan daripada strim badan asal.

Langkah:

  1. Baca isi permintaan asal ke dalam penimbal menggunakan io.ReadAll(r.Body).
  2. Buat dua pembaca baharu daripada penimbal.
  3. Gunakan satu pembaca baharu untuk melakukan pemeriksaan badan (cth., doStuff(rdr1)).
  4. Tugaskan pembaca baharu kedua kepada r.Body, mengekalkan keadaan asal untuk seterusnya pengendali.

Contoh:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2

Faedah:

  1. Memelihara Permintaan Nyatakan: Req.Body asal kekal utuh untuk seterusnya pengendali.
  2. Menyokong Penghuraian Badan: Kaedah pemeriksaan seperti req.ParseForm() boleh digunakan pada pembaca berasingan tanpa menjejaskan keadaan permintaan.
  3. Menyokong Tersuai Pemprosesan Badan: Pembaca berasingan membenarkan pengendalian badan tersuai tanpa mengganggu hiliran operasi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memeriksa Badan Permintaan HTTP Tanpa Kehilangan Data untuk Pengendali Seterusnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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