我试图使用Go / Gin Gonic从HTML表单中捕获一组Post值 - 在PHP中我会使用类似的东西:
<form method="POST" enctype="multipart/form-data" action="mygo">
<input type=hidden name="emails[]" value="email1@email.com">
<input type=hidden name="emails[]" value="email2@email.com">
<input type=hidden name="emails[]" value="email3@email.com">
</form>
然而,这似乎与Gin Gonic(或Go)无关。
我也尝试过:
<form method="POST" enctype="multipart/form-data" action="mygo">
<input type=hidden name="emails" value="email1@email.com">
<input type=hidden name="emails" value="email2@email.com">
<input type=hidden name="emails" value="email3@email.com">
</form>
与其他地方一样,建议这样做会导致c.PostForm("emails")
返回切片。但是在实践中,它似乎反而将最后一个值作为字符串返回:(
有趣的是,即使首先调用c.Request.PostForm
,c.Request.ParseForm()
也会返回空地图。我做错了什么?
Go Form:
func main() {
// ...
router.POST("mygo",parseFunc)
}
func mygo(c *gin.Context) {
c.Request.ParseForm()
log.Printf("%v",c.Request.PostForm["emails"]) // ""
log.Printf("%v",c.PostForm("emails") // "email3@email.com"
}
答案 0 :(得分:3)
为了使它有效,你有两种方法
<form method="POST" enctype="multipart/form-data" action="mygo">
<input type=hidden name="emails" value="email1@email.com">
<input type=hidden name="emails" value="email2@email.com">
<input type=hidden name="emails" value="email3@email.com">
</form>
r.POST("/", func(c *gin.Context) {
c.Request.ParseMultipartForm(1000)
for key, value := range c.Request.PostForm {
fmt.Println(key,value)
}
})
或者
<form method="POST" action="mygo">
<input type=hidden name="emails" value="email1@email.com">
<input type=hidden name="emails" value="email2@email.com">
<input type=hidden name="emails" value="email3@email.com">
</form>
r.POST("/", func(c *gin.Context) {
c.Request.ParseForm()
for key, value := range c.Request.PostForm {
fmt.Println(key,value)
}
})
两者都给出相同的结果
emails [email1@email.com email2@email.com email3@email.com]
答案 1 :(得分:0)
此代码的问题有两个问题。发布我的答案,以防其他人遇到这些问题。
c.Request.PostForm
返回空,因为表单是多部分的,而ParseForm
只解析非多部分表单。要在此处获取数据,请将表单类型更改为非多部分,或在访问帖子值之前调用ParseMultipartForm
。c.PostForm()
只返回第一个值,因为这就是Gin Gonic中的包装器。要访问所有值,必须访问原始c.Request.PostForm
数据,然后才能正确解析它。感谢@JimB的帮助。
答案 2 :(得分:0)
使用最新版本的gin-gonic(v1.2),你可以:
emails := c.PostFormArray("emails")
然后emails
将成为[]string
。
Parse
和iterate
并不是必需的。