【发布时间】:2017-02-20 10:15:40
【问题描述】:
我正在尝试使用 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()。我做错了什么?
去表格:
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"
}
【问题讨论】:
-
要获取多个值,您需要直接使用
Request.Form或Request.PostForm映射。如果这些不存在,请显示minimal reproducible example。例如,您显示的表单将通过 GET 提交到生成表单的相同 url。 -
@JimB - 编辑显示 MCV 示例 :)
-
对不起,您将不得不创建一个更完整的示例,因为您所展示的内容应该仍然有效..
-
@JimB - 啊,我认为我的问题有两个。首先 c.Request.PostForm 可能根本不起作用,因为我的表单中没有显示示例
enctype="multipart/form-data".. 从技术上讲,我认为我不需要我的表单是多部分的,如果我这样做了,我认为只是意味着调用ParseMultipartForm而不是ParseForm- 但是当我使用gonic 调用c.PostForm时调用ParseMultipartForm,但似乎gonic 方法手动返回only the first value - 将检查并更新。 -
预计只返回第一个值的方法,因为这就是标准库
http.Request方法的工作原理。