package main
import "log"
import "github.com/gin-gonic/gin"
type Person struct {
Name string `json:"name"`
Address string `json:"address"`
}
func main() {
log.Println("Hello World")
route := gin.Default()
route.GET("/testing", startPage)
route.Run(":8085")
}
func startPage(c *gin.Context) {
var person Person
if c.BindJSON(&person) == nil {
log.Println(person.Name)
log.Println(person.Address)
log.Println("Binding success...............")
} else {
log.Println("Binding failed...............")
}
c.String(200, "Success")
}
Kode di atas hanya berfungsi untuk curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"
tetapi tidak untuk curl -X GET localhost:8085/testing?name=JJ&address=xyz -H "Content-Type:application/json"
jika saya menggunakan c.Bind(&person)
, pengikatan gagal pada kedua kasus.
Bagaimana saya bisa menulis kode di atas yang mengikat string kueri dan json.
1 untuk c. BindQuery
Kami tidak membutuhkan c.BindQuery
.
Coba c.Bind
untuk string kueri dan data kiriman:
type Person struct {
Name string `form:"name"`
Address string `form:"address"`
}
Coba c.BindJSON
untuk data JSON:
type Person struct {
Name string `json:"name"`
Address string `json:"address"`
}
Melihat ke kode binding, saya tidak melihat di mana pun ia mengakses req.URL.Query (). Saya tidak mengerti bagaimana kita dapat mengikat parameter kueri tanpa itu.
@jasonab menggunakan http.Request.Form, yang berisi parameter kueri.
@appleboy terima kasih! Ini sama sekali tidak jelas dari dokumen. :-(
@ ei-grad Terima kasih, itu tidak jelas :-)
Contoh berikut berhasil untuk saya.
package main
import "log"
import "github.com/gin-gonic/gin"
type Person struct {
Name string `form:"name" json:"name"`
Address string `form:"address" json:"address"`
}
func main() {
route := gin.Default()
route.GET("/testing", startPage)
route.Run(":8085")
}
func startPage(c *gin.Context) {
var person Person
if c.Bind(&person) == nil {
log.Println("====== Bind By Query String ======")
log.Println(person.Name)
log.Println(person.Address)
}
if c.BindJSON(&person) == nil {
log.Println("====== Bind By JSON ======")
log.Println(person.Name)
log.Println(person.Address)
}
c.String(200, "Success")
}
Dan coba perintah berikut:
# bind by query
$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz"
# bind by json
$ curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"
Anda dapat menemukan contohnya dari URL berikut:
https://github.com/gin-gonic/gin#model -binding-and-validation
Mungkin kita perlu menambahkan contoh permintaan bind pada dokumen. 😄
@jasonab @ ei-grad Saya akan memperbarui dokumen secepatnya.
Mungkin kita perlu menambahkan contoh permintaan bind pada dokumen. 😄
Itu akan sangat bagus.
Bagaimana jika Anda memposting nilai dan memiliki parameter string kueri, bagaimana Anda hanya mengurai / mengikat parameter string kueri.
Bind selalu menggunakan r.Form yang merupakan kombinasi dari nilai yang diposting dan parameter kueri ... hal yang sama berlaku untuk hanya ingin mengurai / mengikat r.PostForm dan tidak menginginkan string kueri.
1 untuk BindQuery
@mehdy Lihat komentar https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292
Saya membuat PR baru untuk memperbaiki dokumen. https://github.com/gin-gonic/gin/pull/772
Jadi @appleboy jika Anda memposting data dan memiliki parameter Query string bagaimana Anda HANYA mengikat parameter Query string atau HANYA mengikat data yang diposting?
Sepertinya komentar saya sebelumnya baru saja diabaikan.
https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292
Apakah Anda melihat tangkapan layar?
if c.Bind(&person) == nil {
log.Println("====== Bind By Query String ======")
log.Println(person.Name)
log.Println(person.Address)
}
if c.BindJSON(&person) == nil {
log.Println("====== Bind By JSON ======")
log.Println(person.Name)
log.Println(person.Address)
}
Ya @appleboy Saya memang melihat tangkapan
Contoh Anda adalah untuk Query params dan JSON dan contoh saya adalah posting Form Data dan Query params.
Bagaimana jika seseorang ingin HANYA mengikat Parameter Kueri dan bukan data formulir.
itulah intinya! Saya pikir kita membutuhkan fungsi BindQuery
yang hanya mengikat parameter kueri dan bukan data posting jika seseorang menggunakan keduanya bersama-sama
Lihat PR https://github.com/gin-gonic/gin/pull/1029. Tambahkan c.BindQuery
fungsi yang hanya mengikat parameter kueri dan bukan data kiriman.
package main
import "log"
import "github.com/gin-gonic/gin"
type Person struct {
Name string `form:"name"`
Address string `form:"address"`
}
func main() {
route := gin.Default()
route.Any("/testing", startPage)
route.Run(":8085")
}
func startPage(c *gin.Context) {
var person Person
if c.BindQuery(&person) == nil {
log.Println("====== Only Bind Query String ======")
log.Println(person.Name)
log.Println(person.Address)
}
c.String(200, "Success")
}
Coba perintah berikut:
# only bind query
$ curl -X GET "localhost:8085/testing?name=eason&address=xyz"
# only bind query string, ignore form data
$ curl -X POST "localhost:8085/testing?name=eason&address=xyz" --data 'name=ignore&address=ignore' -H "Content-Type:application/x-www-form-urlencoded"
Akan Mengeluarkan:
Kami tidak membutuhkan
c.BindQuery
.Coba
c.Bind
untuk string kueri dan data kiriman:type Person struct { Name string `form:"name"` Address string `form:"address"` }
Coba
c.BindJSON
untuk data JSON:type Person struct { Name string `json:"name"` Address string `json:"address"` }
bindQuery juga bekerja dengan tag "form"
Komentar yang paling membantu
Contoh berikut berhasil untuk saya.
Dan coba perintah berikut:
Anda dapat menemukan contohnya dari URL berikut:
https://github.com/gin-gonic/gin#model -binding-and-validation
Mungkin kita perlu menambahkan contoh permintaan bind pada dokumen. 😄