Gin: 如何绑定查询字符串?

创建于 2016-11-16  ·  19评论  ·  资料来源: 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")
}

上面的代码仅适用于curl -X GET localhost:8085/testing --data '{"name":"JJ", "address":"xyz"}' -H "Content-Type:application/json"但不适用于curl -X GET localhost:8085/testing?name=JJ&address=xyz -H "Content-Type:application/json"

如果我使用c.Bind(&person) ,则两种情况下的绑定均失败。
我如何编写上面的代码绑定查询字符串和json。

enhancement help wanted question

最有用的评论

以下示例为我工作。

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")
}

并尝试以下命令:

# 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

您可以从以下URL找到示例:

https://github.com/gin-gonic/gin#model -binding-and-validation

也许我们需要在文档上添加绑定查询示例。 😄

所有19条评论

为c.BindQuery +1

我们不需要c.BindQuery

尝试使用c.Bind查询字符串和发布数据:

type Person struct {
    Name    string `form:"name"`
    Address string `form:"address"`
}

尝试c.BindJSON获取JSON数据:

type Person struct {
    Name    string `json:"name"`
    Address string `json:"address"`
}

查看绑定代码,我看不到它访问req.URL.Query()的任何地方。 我不明白没有该如何绑定查询参数。

@jasonab使用http.Request.Form,其中包含查询参数。

@appleboy谢谢! 从文档中绝对不清楚。 :-(

@ ei-grad谢谢,那不是很明显:-)

以下示例为我工作。

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")
}

并尝试以下命令:

# 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

您可以从以下URL找到示例:

https://github.com/gin-gonic/gin#model -binding-and-validation

也许我们需要在文档上添加绑定查询示例。 😄

@jasonab @ ei-grad我将尽快更新文档。

也许我们需要在文档上添加绑定查询示例。 😄

那会很好。

如果您发布了值并具有查询字符串参数该怎么办,您将如何仅解析/绑定查询字符串参数呢?

Bind始终使用r.Form,它是发布值和查询参数的组合...对于只希望解析/绑定r.PostForm而又不希望查询字符串的情况,同样适用。

为BindQuery +1

我制作新的PR来改善文件。 https://github.com/gin-gonic/gin/pull/772

所以@appleboy,如果您发布数据并具有查询字符串参数,那么您如何仅绑定查询字符串参数或仅绑定发布数据?

似乎我以前的评论只是被忽略了。

https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292

您看到截图了吗?

仅绑定查询或发布数据

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

仅绑定json数据

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

是的, @ appleboy我确实看到了屏幕截图,

您的示例用于查询参数和JSON,而我的示例是发布表单数据和查询参数。

如果有人只想绑定查询参数而不绑定表单数据怎么办。

这就是重点! 我认为我们需要一个BindQuery函数,该函数仅绑定查询参数,而不绑定

仅绑定查询字符串

参见PR https://github.com/gin-gonic/gin/pull/1029。 添加仅绑定查询参数而不绑定发布数据的c.BindQuery函数。

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")
}

尝试以下命令:

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

将输出:
2017-07-18 12 09 57

1029合并

我们不需要c.BindQuery

尝试使用c.Bind查询字符串和发布数据:

type Person struct {
  Name    string `form:"name"`
  Address string `form:"address"`
}

尝试c.BindJSON获取JSON数据:

type Person struct {
  Name    string `json:"name"`
  Address string `json:"address"`
}

bindQuery也可以与“ form”标签一起使用

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Bloomca picture Bloomca  ·  3评论

ccaza picture ccaza  ·  3评论

frederikhors picture frederikhors  ·  3评论

boneq picture boneq  ·  3评论

olegsobchuk picture olegsobchuk  ·  3评论