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。
为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"
您可以从以下URL找到示例:
https://github.com/gin-gonic/gin#model -binding-and-validation
也许我们需要在文档上添加绑定查询示例。 😄
@jasonab @ ei-grad我将尽快更新文档。
也许我们需要在文档上添加绑定查询示例。 😄
那会很好。
如果您发布了值并具有查询字符串参数该怎么办,您将如何仅解析/绑定查询字符串参数呢?
Bind始终使用r.Form,它是发布值和查询参数的组合...对于只希望解析/绑定r.PostForm而又不希望查询字符串的情况,同样适用。
为BindQuery +1
@mehdy查看评论https://github.com/gin-gonic/gin/issues/742#issuecomment -264681292
我制作新的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)
}
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"
将输出:
我们不需要
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”标签一起使用
最有用的评论
以下示例为我工作。
并尝试以下命令:
您可以从以下URL找到示例:
https://github.com/gin-gonic/gin#model -binding-and-validation
也许我们需要在文档上添加绑定查询示例。 😄