我正在尝试使用 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>
Run Code Online (Sandbox Code Playgroud)
然而,这似乎不适用于 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>
Run Code Online (Sandbox Code Playgroud)
与其他地方一样,建议这样做会导致c.PostForm("emails")返回一个切片。但是实际上,这似乎将最后一个值作为字符串返回:(
有趣的是c.Request.PostForm,即使c.Request.ParseForm()首先调用,也会返回一个空映射。我究竟做错了什么?
去表格:
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"
}
Run Code Online (Sandbox Code Playgroud)
小智 7
使用最新版本的 gin-gonic (v1.2),您可以:
emails := c.PostFormArray("emails")
Run Code Online (Sandbox Code Playgroud)
然后emails将是一个[]string.
Parse并且iterate没有更多的必要。
为了使它工作,你在这里有两种方法
<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)
}
})
Run Code Online (Sandbox Code Playgroud)
任何一个
<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)
}
})
Run Code Online (Sandbox Code Playgroud)
两者都给出相同的结果
emails [email1@email.com email2@email.com email3@email.com]
Run Code Online (Sandbox Code Playgroud)
这段代码的问题有两个。发布我的答案以防其他人遇到这些问题。
c.Request.PostForm在这种情况下返回空,因为表单是多部分的并且ParseForm仅解析非多部分表单。为了获取此处的数据,请将表单类型更改为非多部分或调用ParseMultipartForm在访问发布值之前调用。c.PostForm()只返回第一个值,因为这就是 Gin Gonic 中的包装器所做的。为了访问所有值,有必要访问原始c.Request.PostForm数据,然后在正确解析它之后。感谢@JimB 的帮助。