
Gin 查询参数绑定数组怎么用 collection_format 在 multi、csv、ssv、tsv 之间选择【免费下载链接】ginGin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.项目地址: https://gitcode.com/GitHub_Trending/gi/gin当 Gin 接口需要从查询字符串里读取多个值并绑定到结构体的切片或数组字段时collection_format标签决定了多个值在参数里长什么样是同一个 key 重复出现还是把多个值用逗号、空格或制表符拼在一个参数值里。下面的内容基于 docs/doc.md 的 Collection format for arrays 章节以及 binding/form_mapping.go 中的实现说明标签怎么写、如何验证、四种格式怎么按客户端的请求形态来选。collection_format 的可选取值文档给出的格式表如下pipes是文档额外列出的第五种取值FormatDescriptionExamplemulti (default)Multiple parameter instances rather than multiple values.keyfookeybarkeybazcsvComma-separated values.foo,bar,bazssvSpace-separated values.foo bar baztsvTab-separated values.foo\tbar\tbazpipesPipe-separated values.foo|bar|baz两个前提该标签只对切片/数组字段有意义普通标量字段不需要不写collection_format时默认就是multi标签只接受上表中的取值写其他值例如collection_format:xxx会在绑定时返回错误。声明字段并用 curl 验证csv 主路径下面的示例取自 docs/doc.md 中 Collection format for arrays 的代码只保留了与数组绑定相关的字段。Addresses声明为csv即客户端把多个值用逗号拼在一个参数里package main import ( log github.com/gin-gonic/gin ) type Person struct { Name string form:name Addresses []string form:addresses collection_format:csv } func main() { route : gin.Default() route.GET(/testing, startPage) route.Run(:8085) } func startPage(c *gin.Context) { var person Person // 文档说明If GET, only Form binding engine (query) used. if c.ShouldBind(person) nil { log.Println(person.Name) log.Println(person.Addresses) } c.String(200, Success) }启动后按文档给出的方式测试curl -X GET localhost:8085/testing?nameappleboyaddressesfoo,barbirthday1992-03-15createTime1562400033000000123unixTime1562400033判断结果HTTP 响应体是Success对应代码中的c.String(200, Success)同时服务端日志会打印person.Name与person.Addresses两行即绑定出来的appleboy和addresses切片的值。如果客户端实际按空格发送addressesfoo bar而字段声明为csvbinding/form_mapping.go 中的拆分逻辑只会按 tag 指定的分隔符这里是逗号拆分不会按空格拆字段将得到一个含空格的单元素切片。场景是查询参数时也可以把ShouldBind换成ShouldBindQuery文档 Only Bind Query String 一节说明它只绑定 query params、不读 post data。文档同时说明 GET 请求下ShouldBind只会走 formquery绑定器所以对 GET 请求两者读取的都是查询参数。在 multi、csv、ssv、tsv 之间选择选择依据就是客户端实际发送的参数形态让 tag 与客户端一致即可客户端重复同一个 keykeyfookeybarkeybaz→ 用multi。它是默认值字段可以完全不写collection_formattype Person struct { Name string form:name Addresses []string form:addresses // 不写 collection_format 即 multi }curl -X GET localhost:8085/testing?nameappleboyaddressesfooaddressesbaraddressesbaz多个值用逗号拼在一个 key 里foo,bar,baz→collection_format:csv即上一节的主路径多个值用空格分隔foo bar baz→collection_format:ssv多个值用制表符分隔foo\tbar\tbaz→collection_format:tsv。上表右列的参数形态来自文档表格实际请求中由客户端按其编码发送。字段切换格式时只需改 tag例如把Addresses改成collection_format:ssv后客户端就应按空格分隔的值发送。客户端未传参时的 default 规则字段里还可以用form:...,default...指定默认值。文档对集合类型的默认值给出了三条规则逗号用于分隔 tag 的选项因此不能出现在 default 值里否则行为未定义对multi和csv两种格式应改用分号代替逗号来分隔 default 值正因为分号用于分隔multi/csv的 default 值default 值里不能出现分号。文档示例中的两个字段正好对应这两条规则ssv用空格分隔、csv用分号分隔type Person struct { Name string form:name,defaultWilliam Age int form:age,default10 Friends []string form:friends,defaultWill;Bill Addresses [2]string form:addresses,defaultfoo bar collection_format:ssv LapTimes []int form:lap_times,default1;2;3 collection_format:csv }测试与文档给出的示例输出curl -X POST http://localhost:8080/person{Name:William,Age:10,Friends:[Will,Bill],Colors:[red,blue],LapTimes:[1,2,3]}上面这段是文档示例输出用于说明默认值绑定后接口返回的是完整结构体的 JSON不要把其中的字段当成固定的成功判定。绑定失败时的表现与报错定位结合文档 Model binding and validation 一节与源码绑定出错时按以下情况判断绑定方法的行为差异Bind、BindQuery等 Must 系列在出错时会以c.AbortWithError(400, err)中止请求状态码置为 400ShouldBind、ShouldBindQuery等 Should 系列只返回错误由你自己决定如何响应。需要向客户端解释原因时用 Should 系列。collection_format 取值不合法binding/form_mapping.go 对不支持的标签值返回错误格式为%s is not supported in the collection_format. (multi, csv, ssv, tsv, pipes)例如 tag 写成collection_format:xxx时会得到xxx is not supported in the collection_format. (multi, csv, ssv, tsv, pipes)。TestMappingCollectionFormatInvalid 验证了这种情况下切片和数组的绑定都会返回错误。定长数组元素数量不符拆分后的值数量与数组长度不一致时binding/form_mapping.go 返回%q is not valid value for %s形式的错误TestMappingArray 验证了向[2]int只发一个值时绑定失败。元素类型转换失败例如把非数字值绑定到[]int字段同样返回错误见 TestMappingArray 中formSource{array: {wrong}}的用例。如果你还需要从路径参数中解析数组测试代码里展示了同样的collection_format标签配合uri标签的用法例如 binding/form_mapping_test.go 中的uri:path collection_format:csv规则与查询参数场景一致。【免费下载链接】ginGin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.项目地址: https://gitcode.com/GitHub_Trending/gi/gin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考