Gin Gonic массив значений из PostForm

Я пытаюсь захватить массив значений Post из HTML-формы с помощью Go / Gin Gonic - в PHP я бы использовал что-то вроде:

<form method="POST" enctype="multipart/form-data" action="mygo">
 <input type=hidden name="emails[]" value="[email protected]">
 <input type=hidden name="emails[]" value="[email protected]">
 <input type=hidden name="emails[]" value="[email protected]">
</form>

Однако, похоже, это не работает с Gin Gonic (или Go, если на то пошло).

Я также пробовал:

<form method="POST" enctype="multipart/form-data" action="mygo">
 <input type=hidden name="emails" value="[email protected]">
 <input type=hidden name="emails" value="[email protected]">
 <input type=hidden name="emails" value="[email protected]">
</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") // "[email protected]"
}

person BadPirate    schedule 11.10.2016    source источник
comment
Чтобы получить несколько значений, вам нужно напрямую использовать карты Request.Form или Request.PostForm. Если их там нет, покажите минимальный воспроизводимый пример. Например, форма, которую вы показываете, будет отправлена ​​через GET на тот же URL-адрес, который сгенерировал форму.   -  person JimB    schedule 11.10.2016
comment
@JimB - Отредактировано, чтобы показать пример MCV :)   -  person BadPirate    schedule 12.10.2016
comment
Извините, вам придется создать более полный пример, потому что то, что вы показали, все равно должно работать ...   -  person JimB    schedule 12.10.2016
comment
@JimB - А, я думаю, у меня было две проблемы. Сначала c.Request.PostForm, скорее всего, вообще не работает из-за того, что в моей форме что-то не показано в примере enctype="multipart/form-data" .. Технически я не думаю, что мне нужно, чтобы моя форма была составной, и если бы я это сделал, я бы просто означает вызов ParseMultipartForm, а не ParseForm - ParseMultipartForm, однако, вызывается, когда я вызываю c.PostForm с помощью gonic, но похоже, что метод gonic вручную возвращает только первое значение - проверю и обновлю.   -  person BadPirate    schedule 12.10.2016
comment
Ожидаются методы, возвращающие только первое значение, потому что так работают методы std lib http.Request.   -  person JimB    schedule 12.10.2016


Ответы (3)


Чтобы заставить его работать, у вас есть два пути.

<form method="POST" enctype="multipart/form-data" action="mygo">
 <input type=hidden name="emails" value="[email protected]">
 <input type=hidden name="emails" value="[email protected]">
 <input type=hidden name="emails" value="[email protected]">
</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="[email protected]">
     <input type=hidden name="emails" value="[email protected]">
     <input type=hidden name="emails" value="[email protected]">
    </form>

 r.POST("/", func(c *gin.Context) {
            c.Request.ParseForm()
            for key, value := range c.Request.PostForm {
                fmt.Println(key,value)
            }
        })

Оба дают одинаковый результат

emails [[email protected] [email protected] [email protected]]
person Marcel Novy    schedule 12.10.2016

С последней версией gin-gonic (v1.2) вы можете просто:

emails := c.PostFormArray("emails")

Тогда emails будет []string.

Parse и iterate больше не нужны.

person algorix    schedule 24.04.2018

Проблема с этим кодом двоякая. Отправляю свой ответ на случай, если у кого-то еще есть одна из этих проблем.

  1. c.Request.PostForm в этом случае возвращает пустое значение, потому что форма является составной, а ParseForm анализирует только не составные формы. Чтобы получить здесь данные, либо измените тип формы на не составную, либо вызовите ParseMultipartForm перед доступом к значениям сообщений.
  2. c.PostForm() возвращает только первое значение, потому что это то, что делает оболочка в Gin Gonic. Чтобы получить доступ ко всем значениям, необходимо получить доступ к исходным c.Request.PostForm данным, а затем ПОСЛЕ их правильного анализа.

Спасибо @JimB за помощь.

person BadPirate    schedule 12.10.2016