在gin gonic中有没有一种方法可以干净利落地组合绑定,或者像BindAll这样的东西。在我的例子中,我同时有query和json参数,所以绑定/BindJSON和BindQuery。如果我一直理解到这里,绑定必须一个接一个地使用,这使得代码变得混乱。不幸的是,即使在大量的谷歌搜索之后,我也没有找到任何合理的东西(示例仅限于一种类型)。示例:
type Params struct {
Userid string `form:"user_id" json:"user_id" query:"user_id" binding:"required"`
Password string `json:"password" binding:"required"`
}
func Create(c *gin.Context) {
var params Params
if err := c.ShouldBind(¶ms); err == nil {
log.Println("GOOD1")
log.Println(params)
} else {
log.Println("ERROR1")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
if err := c.ShouldBindQuery(¶ms); err == nil {
log.Println("GOOD2")
log.Println(params)
} else {
log.Println("ERROR2")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
}
呼叫:
curl -X POST http://0.0.0.0:8080/v1/receipt?user_id=123 -H "Content-Type:application/json" -d '{"login":"my_login","password":"my_password"}'
期望如下所示:
if err := c.ShouldBindAll(¶ms); err == nil {
log.Println("GOOD1")
log.Println(params)
} else {
log.Println("ERROR1")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
发布于 2021-10-20 08:01:36
// If `GET`, only `Form` binding engine (`query`) used.
// If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`).
// See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48
if c.ShouldBind(&person) == nil {
gin不能做“组合绑定”,“content-type”会告诉它如何绑定数据。如果你想正确解析查询参数,就不能使用c.Query
来获取user_id
参数。
var params Params
if err := c.ShouldBind(¶ms); err == nil {
log.Println("GOOD1")
params.UserId = c.Query("user_id")
log.Println(params)
} else {
log.Println("ERROR1")
log.Println(params)
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
https://stackoverflow.com/questions/69641408
复制相似问题