Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membaca Badan Permintaan Go-Gin Berbilang Kali?

Bagaimana untuk Membaca Badan Permintaan Go-Gin Berbilang Kali?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-28 17:04:11896semak imbas

How to Read a Go-Gin Request Body Multiple Times?

Go-Gin: Membaca Badan Permintaan Berkali-kali

Dalam Go-Gin, membaca kandungan permintaan boleh menjadi rumit jika anda perlu mengakses ia berkali-kali. Isu timbul apabila perisian tengah mengubah suai isi permintaan, menjadikan akses seterusnya sukar.

Pertimbangkan senario berikut: anda mempunyai perisian tengah pengesahan yang membaca kandungan untuk pengesahan, diikuti oleh pengendali lain yang memerlukan badan yang tidak diubah suai. Dalam kes ini, pengubahsuaian middleware mengganggu akses pengendali seterusnya kepada badan asal.

Untuk menyelesaikan isu ini, anda boleh menggunakan pendekatan berikut:

  1. Baca isi permintaan ke dalam pembolehubah sebelum menghantarnya ke perisian tengah:
bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
  1. Luluskan pembolehubah badan kepada perisian tengah dan lakukan pengesahan padanya:
if err := c.ShouldBindJSON(&user); err != nil {
    // Validation logic
}
  1. Selepas pengesahan, pulihkan badan asal menggunakan io.NopCloser:
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(ByteBody))
  1. Kini, pembolehubah bodyBytes mengandungi badan asal yang tidak diubah suai, dan anda boleh menggunakannya dalam pengendali berikutnya tanpa sebarang isu.

Untuk melaksanakan penyelesaian ini dalam kod yang disediakan, gantikan baris berikut dalam middleware:

// var bodyBytes []byte
// if c.Request.Body != nil {
//  bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
// }

dengan:

bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))

Atas ialah kandungan terperinci Bagaimana untuk Membaca Badan Permintaan Go-Gin Berbilang Kali?. 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