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")
}
O código acima funciona apenas para curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"
mas não para curl -X GET localhost:8085/testing?name=JJ&address=xyz -H "Content-Type:application/json"
se eu usar c.Bind(&person)
, a ligação falhou em ambos os casos.
Como posso escrever o código acima, que vincula a string de consulta e json.
+1 para c.BindQuery
Não precisamos de c.BindQuery
.
Experimente c.Bind
para string de consulta e dados de postagem:
type Person struct {
Name string `form:"name"`
Address string `form:"address"`
}
Experimente c.BindJSON
para dados JSON:
type Person struct {
Name string `json:"name"`
Address string `json:"address"`
}
Olhando para o código de ligação, não vejo nenhum lugar que acesse req.URL.Query (). Não entendo como podemos vincular parâmetros de consulta sem isso.
@jasonab ele usa http.Request.Form, que contém parâmetros de consulta.
@appleboy obrigado! Isso não está absolutamente claro nos documentos. :-(
@ ei-grad Obrigado, isso não era óbvio :-)
O exemplo a seguir está funcionando para mim.
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")
}
E tente o seguinte comando:
# 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"
Você pode encontrar o exemplo no seguinte URL:
https://github.com/gin-gonic/gin#model -binding-and-validation
Talvez precisemos adicionar exemplo de consulta de ligação em documentos. 😄
@jasonab @ ei-grad Vou atualizar o documento o mais
Talvez precisemos adicionar exemplo de consulta de ligação em documentos. 😄
Seria ótimo.
E se você postasse valores e tivesse parâmetros de string de consulta, como você apenas analisaria / vincularia os parâmetros de string de consulta.
O Bind sempre usa r.Form que é uma combinação de valores postados e parâmetros de consulta ... o mesmo vale para apenas querer analisar / vincular r.PostForm e não querer string de consulta.
+1 para BindQuery
@mehdy Veja o comentário https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292
Eu faço um novo PR para melhorar o documento. https://github.com/gin-gonic/gin/pull/772
Portanto, @appleboy se você postou dados e tinha parâmetros de string de consulta, como poderia SOMENTE vincular os parâmetros de string de consulta ou SOMENTE os dados postados?
Parece que meu comentário anterior foi simplesmente esquecido.
https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292
Você vê a imagem?
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)
}
Sim @appleboy , vi a captura de tela,
seu exemplo é para parâmetros de consulta e JSON e meu exemplo postou dados de formulário e parâmetros de consulta.
E se alguém quisesse vincular SOMENTE os parâmetros de consulta e não os dados do formulário.
esse é exatamente o ponto! Acho que precisamos de uma função BindQuery
que apenas vincule os parâmetros de consulta e não os dados de postagem , caso alguém esteja usando os dois juntos
Consulte PR https://github.com/gin-gonic/gin/pull/1029. Adicione a função c.BindQuery
que vincula apenas os parâmetros de consulta e não os dados de postagem.
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")
}
Tente o seguinte comando:
# 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"
Irá produzir:
Não precisamos de
c.BindQuery
.Experimente
c.Bind
para string de consulta e dados de postagem:type Person struct { Name string `form:"name"` Address string `form:"address"` }
Experimente
c.BindJSON
para dados JSON:type Person struct { Name string `json:"name"` Address string `json:"address"` }
bindQuery também funciona com a tag "form"
Comentários muito úteis
O exemplo a seguir está funcionando para mim.
E tente o seguinte comando:
Você pode encontrar o exemplo no seguinte URL:
https://github.com/gin-gonic/gin#model -binding-and-validation
Talvez precisemos adicionar exemplo de consulta de ligação em documentos. 😄