Echo 框架 Bind() html FormData

我有一个像这样的表单 html:


<input name="email"type="email" />

<input name="password"type="password" />

<input name="tags[name][]"type="text" />

<input name="tags[count][]"type="number" />

<input name="tags[name][]"type="text" />

<input name="tags[count][]"type="number" />

<input name="tags[name][]"type="text" />

<input name="tags[count][]"type="number" />

<input name="freeword[]"type="text" />

<input name="freeword[]"type="text" />

我想要Bind()这样的表格struct:


type UserFrom struct {

  Email string `json:"email" form:"email" query:"email"`

  Password string `json:"password" form:"password" query:"password"`

  Tags []Tag

  Free []string `json:"freeword[]" form:"freeword[]" query:"freeword[]"`

}

type Tag struct {

  Name string `json:"tags[name][]" form:"tags[name][]" query:"tags[name][]"`

  Count string `json:"tags[count][]" form:"tags[count][]" query:"tags[count][]"`

}

但是如果我打印我Bind()之后的结果:POST


u := new(UserFrom)

if err = c.Bind(u); err != nil {

  return

}

log.Println(u)

这个糟糕的输出:


&{email@mail.tld pwdpwdpwd [] [word1 word2]}

Tags []Tag结构中的行UserFrom不起作用


如果你尝试更改Tags []Tag为Tags Tag我有一个很好的最后一个条目


&{email@mail.tld pwdpwdpwd {tag3 3} [word1 word2]}

我想要这个输出:


&{email@mail.tld pwdpwdpwd [{tag1 1} {tag2 2} {tag3 3}] [word1 word2]}

你知道这个问题吗?

Echo Doc 绑定()


长风秋雁
浏览 113回答 1
1回答

蛊毒传说

有两个问题:您没有正确指定表单输入名称,您拥有它们的方式永远无法映射到您想要的任何语言。在支持您想要的语言中,它将标签映射到两个字段(名称和计数)的结构,每个字段由一个数组组成。不是名称和计数结构的数组。名称应该是这样的tags[][name],以实现你想要的。即使您按照上述正确指定了名称,它也不会在 Echo 中工作,因为它依赖于http.Request.Form解析值,这实际上url.Values只是一个map[string][]string. 如您所见,这不可能捕获您想要的结构。现在,仅仅因为 Echo 不支持开箱即用,并不意味着您不能这样做。您可以使用具有所需功能的第三方库进行绑定,以下代码:package mainimport (    "fmt"    "net/url"    "github.com/monoculum/formam")type User struct {    Email,    Password string    Tags []struct {        Tag   string        Count int    }}func main() {    formData := "Email=joe@example.com&Password=secret&Tags[0].Tag=red&" +         "Tags[0].Count=1&Tags[1].Tag=blue"    q, _ := url.ParseQuery(formData)    u := new(User)    dec := formam.NewDecoder(nil)    if err := dec.Decode(q, u); err != nil {        fmt.Println(err)        return    }    fmt.Println(u)}结果是你需要的:&{joe@example.com secret [{red 1} {blue 0}]}希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP