7

我正在尝试使用 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"
}
4

4 回答 4

7

为了使其正常工作,您有两种方法

<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]
于 2016-10-12T18:34:40.733 回答
4

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

emails := c.PostFormArray("emails")

然后emails将是一个[]string.

Parse并且iterate没有更多必要。

于 2018-04-24T14:39:19.103 回答
2

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

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

感谢@JimB 的协助。

于 2016-10-12T17:34:34.577 回答
0

我知道它已经晚了大约 5 年,但由于我也在寻找这个,我认为如果我分享我的答案,它仍然对某人有用。

最简单的方法之一是:

在 HTML 中

<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>

在围棋中:

emails, ok := c.Request.PostForm["emails[]"]
if ok {
    fmt.Println("this are your emails: ", emails)
}

于 2021-08-24T12:21:35.107 回答