Mengambil semula JSON daripada Badan Permintaan dalam Go
Apabila bekerja dengan permintaan POST yang mengandungi kandungan JSON, adalah perlu untuk mengekstrak data JSON daripada badan permintaan itu. Walau bagaimanapun, ini boleh menjadi tugas yang membingungkan bagi pemula Go yang memindahkan kod daripada bahasa seperti Node.js.
Untuk menangani isu ini, beberapa pendekatan telah dicuba:
var v antara muka{}<br>err := json.NewDecoder(context.Request().Body).Decode(&v)<br>if err != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return result, err
}
fmt .Println(v)
Dalam contoh ini, keputusan selalunya akan kosong, menunjukkan bahawa badan kosong. Ini kerana http.Request.Body ialah penimbal dan setelah data dibaca daripadanya, ia tidak boleh dibaca semula.
Pendekatan lain ialah:
m := echo .Map{}<br>if err := context.Bind(&m); err != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">return result, err
}
fmt.Println(m)
Di sini, kod tersebut menghasilkan mesej ralat "EOF ." Ralat ini berlaku kerana tiada pengepala jenis kandungan dalam permintaan, jadi Echo tidak dapat menentukan jenis data yang dihantar.
Akhir sekali, percubaan untuk membaca kandungan secara langsung:
< pra>badan, ralat := ioutil.ReadAll(context.Request().Body)
jika ralat != tiada {
return result, error
}
fmt.Println(body)
Menghasilkan tatasusunan bait kosong, kerana ioutil.ReadAll() menggunakan badan permintaan.
Penyelesaian terletak pada memahami sifat http.Request.Body sebagai penimbal dan mencari cara untuk memulihkannya selepas membaca. Coretan kod berikut menyediakan penyelesaian:
// Baca kandungan Kandungan<br>var bodyBytes []byte<br>if context.Request().Body != nil {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">bodyBytes, _ = ioutil.ReadAll(context.Request().Body)
}
// Pulihkan io.ReadCloser kepada keadaan asalnya
context.Request().Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
// Teruskan menggunakan Badan, seperti Mengikatnya pada struct:
order := new(models.GeaOrder)
error := context.Bind(order)
Dengan penyelesaian ini, kini anda boleh membaca badan, mengekalkan kandungannya untuk kegunaan kemudian dan mengikat datanya pada struktur dengan jayanya.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Data JSON daripada Badan Permintaan dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!