Gin: como ligar string de consulta?

Criado em 16 nov. 2016  ·  19Comentários  ·  Fonte: gin-gonic/gin

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.

enhancement help wanted question

Comentários muito úteis

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"

screen shot 2016-12-04 at 10 56 58 am

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. 😄

Todos 19 comentários

+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"

screen shot 2016-12-04 at 10 56 58 am

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?

apenas vincule a consulta ou poste os dados

    if c.Bind(&person) == nil {
        log.Println("====== Bind By Query String ======")
        log.Println(person.Name)
        log.Println(person.Address)
    }

apenas vincule os dados json

    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

Apenas Bind Query String

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:
2017-07-18 12 09 57

1029 mesclado

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"

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

mdnight picture mdnight  ·  3Comentários

olegsobchuk picture olegsobchuk  ·  3Comentários

sofish picture sofish  ·  3Comentários

ccaza picture ccaza  ·  3Comentários

wangcn picture wangcn  ·  3Comentários