回声框架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()after 的结果POST

u := new(UserFrom)
if err = c.Bind(u); err != nil {
  return
}
log.Println(u)

这个不好的输出:

&{[email protected] pwdpwdpwd [] [word1 word2]}

该行Tags []TagUserFrom结构不起作用

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

&{[email protected] pwdpwdpwd {tag3 3} [word1 word2]}

我想要这个输出:

&{[email protected] pwdpwdpwd [{tag1 1} {tag2 2} {tag3 3}] [word1 word2]}

你对这个问题有想法吗?

回声文档绑定()

alexaandru:

有两个问题:

  1. 您没有正确指定表单输入名称,因此使用它们的方式永远无法映射到任何语言的名称。在支持所需语言的语言中,它将标记映射到两个字段(名称和计数)的结构,每个字段由一个数组组成。不包含名称和计数结构的数组。tags[][name]为了实现您想要的名称,名称应该像这样,例如,请参见此处:HTML表单:POST对象数组
  2. 即使您按照上述正确指定了名称,它也无法在Echo中使用,因为它依赖于http.Request.Form解析值,实际上url.Values这实际上只是一个map[string][]string如您所见,这可能无法捕获您想要的结构。这是相关的票证:https : //github.com/golang/go/issues/29703

现在,仅因为Echo不支持该功能,并不意味着您无法做到这一点。您可以使用具有所需功能的第三方库进行绑定,例如https://github.com/monoculum/formam

如下代码:

package main

import (
    "fmt"
    "net/url"

    "github.com/monoculum/formam"
)

type User struct {
    Email,
    Password string
    Tags []struct {
        Tag   string
        Count int
    }
}

func main() {
    formData := "[email protected]&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)
}

满足您的需求:

&{[email protected] secret [{red 1} {blue 0}]}

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章