来自PostForm的Gin Gonic数组

时间:2016-10-11 18:49:35

标签: go go-gin

我试图使用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.PostFormc.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"
}

3 个答案:

答案 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)

此代码的问题有两个问题。发布我的答案,以防其他人遇到这些问题。

    在这种情况下,
  1. c.Request.PostForm返回空,因为表单是多部分的,而ParseForm只解析非多部分表单。要在此处获取数据,请将表单类型更改为非多部分,或在访问帖子值之前调用ParseMultipartForm
  2. c.PostForm()只返回第一个值,因为这就是Gin Gonic中的包装器。要访问所有值,必须访问原始c.Request.PostForm数据,然后才能正确解析它。
  3. 感谢@JimB的帮助。

答案 2 :(得分:0)

使用最新版本的gin-gonic(v1.2),你可以:

emails := c.PostFormArray("emails")

然后emails将成为[]string

Parseiterate并不是必需的。