Golang嵌套结构体转URL编码:如何生成方括号格式POST体?
解决嵌套结构体生成全括号式URL编码的问题
我明白你的痛点——ajg/form默认生成的点分隔格式(比如subjects.0.name)不被服务器识别,而你需要的是subjects[0][name]这种每一层嵌套都用括号包裹的URL编码格式。下面给你具体的解决方案:
一、ajg/form的局限性说明
首先得明确:ajg/form的核心设计就是用点(.)来分隔嵌套结构体的字段,哪怕你调整配置让数组索引用括号包裹,最终生成的格式还是subjects[0].name,依然不符合服务器要求的subjects[0][name]。所以如果服务器严格要求全括号的嵌套格式,ajg/form可能没办法直接满足你的需求,建议换用下面的替代包。
二、推荐使用的替代包
1. github.com/go-playground/form
这个包是Go生态中处理URL编码表单的常用工具,默认就支持生成你需要的全括号格式,使用起来非常省心:
步骤1:安装包
go get github.com/go-playground/form/v4
步骤2:定义结构体
保持和之前一致的form标签即可:
type Subject struct { Name string `form:"name"` Tag string `form:"tag"` } type Student struct { StudName string `form:"stud_name"` Subjects []Subject `form:"subjects"` }
步骤3:编码示例
import ( "net/url" "github.com/go-playground/form/v4" ) func main() { // 构造测试数据 student := Student{ StudName: "newStudent", Subjects: []Subject{ {Name: "maths", Tag: "mathstag"}, {Name: "english", Tag: "englishtag"}, }, } // 创建编码器 encoder := form.NewEncoder() values := make(url.Values) // 编码结构体到url.Values err := encoder.Encode(values, student) if err != nil { // 这里处理错误,比如log.Fatal(err) } // 转为你需要的URL编码字符串 result := values.Encode() // 输出结果:subjects[0][name]=maths&subjects[0][tag]=mathstag&subjects[1][name]=english&subjects[1][tag]=englishtag&stud_name=newStudent }
2. github.com/gorilla/schema
另一个老牌的表单处理包,同样支持生成全括号格式的URL编码,用法类似:
步骤1:安装包
go get github.com/gorilla/schema
步骤2:编码示例
import ( "net/url" "github.com/gorilla/schema" ) func main() { student := Student{ StudName: "newStudent", Subjects: []Subject{ {Name: "maths", Tag: "mathstag"}, {Name: "english", Tag: "englishtag"}, }, } encoder := schema.NewEncoder() values := make(url.Values) err := encoder.Encode(student, values) if err != nil { // 处理错误 } result := values.Encode() // 输出同样符合你的需求 }
这两个包都经过广泛验证,能完美生成服务器需要的URL编码格式,比调整ajg/form要高效得多。
内容的提问来源于stack exchange,提问作者Rakesh Ranjan
相关产品推荐
相关产品推荐

