来自 PostForm 的 Gin Gonic 值数组

Bad*_*ate 7 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>
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没有更多的必要。


Mar*_*ovy 6

为了使它工作,你在这里有两种方法

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


Bad*_*ate 2

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

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

感谢@JimB 的帮助。