为了账号安全,请及时绑定邮箱和手机立即绑定

Echo 框架 Bind() html FormData

Echo 框架 Bind() html FormData

Go
长风秋雁 2023-06-05 09:10:53
我有一个像这样的表单 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()之后的结果:POSTu := 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 绑定()
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

有两个问题:

  1. 您没有正确指定表单输入名称,您拥有它们的方式永远无法映射到您想要的任何语言。在支持您想要的语言中,它将标签映射到两个字段(名称和计数)的结构,每个字段由一个数组组成。不是名称和计数结构的数组。名称应该是这样的tags[][name],以实现你想要的。

  2. 即使您按照上述正确指定了名称,它也不会在 Echo 中工作,因为它依赖于http.Request.Form解析值,这实际上url.Values只是一个map[string][]string. 如您所见,这不可能捕获您想要的结构。

现在,仅仅因为 Echo 不支持开箱即用,并不意味着您不能这样做。您可以使用具有所需功能的第三方库进行绑定,

以下代码:

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=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}]}

希望这可以帮助!


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信