从 Gin golang 中读取 QueryArray
Reading QueryArray from Gin golang
您好,我正在像这样向我的 gin 服务器传递一个查询参数:
curl -X POST \
'http://localhost:4000/url?X=val1&Y=val2&x[]=1&x[]=2'
然后将其发送到我的杜松子酒处理函数
func handler (c *gin.Context) {
fmt.Println(c.Query("X"))
fmt.Println(c.Query("Y"))
fmt.Println(c.QueryArray("x"))
}
虽然 c.Query("x") 和 c.Query("Y") 有效,但 c.QueryArray("x") 无效!
我不确定我在这里错过了什么。我也对 GET 请求进行了同样的尝试,但它不起作用。
其他对我不起作用的实验在这里:
fmt.Println(c.Params.Get("x"))
fmt.Println(c.Params.Get("gene"))
fmt.Println(c.PostFormArray("x"))
根据我对 SO 用户的评论草拟的答案。
使用以下值重复字段名称:
curl -X POST 'http://localhost:4000/url?X=val1&Y=val2&x=1&x=2'
或:
逗号分隔:
curl -X POST 'http://localhost:4000/url?X=val1&Y=val2&x=1,2'
这可能 over-engineered,但它帮我完成了任务:
// @Param property_type query []uint32 false "property_types"
func (svc *HttpService) acceptListofQuery(c *gin.Context) {
var propertyTypes []uint32
propertyTypes, done := svc.parsePropTypes(c)
if done {
return
}
// ..... rest of logic here
c.JSON(200, "We good")
}
func (svc *HttpService) parsePropTypes(c *gin.Context) ([]uint32, bool) {
var propertyTypes []uint32
var propertyTypesAsString string
var propertyTypesAsArrayOfStrings []string
propertyTypesAsString, success := c.GetQuery("property_types")
propertyTypesAsArrayOfStrings = strings.Split(propertyTypesAsString, ",")
if success {
for _, propertyTypeAsString := range propertyTypesAsArrayOfStrings {
i, err := strconv.Atoi(propertyTypeAsString)
if err != nil {
svc.ErrorWithJson(c, 400, errors.New("invalid property_types array"))
return nil, true
}
propertyTypes = append(propertyTypes, uint32(i))
}
}
return propertyTypes, false
}
然后你可以发送这样的东西:
curl -X POST 'http://localhost:4000/url?property_types=1,4,7,12
您好,我正在像这样向我的 gin 服务器传递一个查询参数:
curl -X POST \
'http://localhost:4000/url?X=val1&Y=val2&x[]=1&x[]=2'
然后将其发送到我的杜松子酒处理函数
func handler (c *gin.Context) {
fmt.Println(c.Query("X"))
fmt.Println(c.Query("Y"))
fmt.Println(c.QueryArray("x"))
}
虽然 c.Query("x") 和 c.Query("Y") 有效,但 c.QueryArray("x") 无效!
我不确定我在这里错过了什么。我也对 GET 请求进行了同样的尝试,但它不起作用。
其他对我不起作用的实验在这里:
fmt.Println(c.Params.Get("x"))
fmt.Println(c.Params.Get("gene"))
fmt.Println(c.PostFormArray("x"))
根据我对 SO 用户的评论草拟的答案。
使用以下值重复字段名称:
curl -X POST 'http://localhost:4000/url?X=val1&Y=val2&x=1&x=2'
或:
逗号分隔:
curl -X POST 'http://localhost:4000/url?X=val1&Y=val2&x=1,2'
这可能 over-engineered,但它帮我完成了任务:
// @Param property_type query []uint32 false "property_types"
func (svc *HttpService) acceptListofQuery(c *gin.Context) {
var propertyTypes []uint32
propertyTypes, done := svc.parsePropTypes(c)
if done {
return
}
// ..... rest of logic here
c.JSON(200, "We good")
}
func (svc *HttpService) parsePropTypes(c *gin.Context) ([]uint32, bool) {
var propertyTypes []uint32
var propertyTypesAsString string
var propertyTypesAsArrayOfStrings []string
propertyTypesAsString, success := c.GetQuery("property_types")
propertyTypesAsArrayOfStrings = strings.Split(propertyTypesAsString, ",")
if success {
for _, propertyTypeAsString := range propertyTypesAsArrayOfStrings {
i, err := strconv.Atoi(propertyTypeAsString)
if err != nil {
svc.ErrorWithJson(c, 400, errors.New("invalid property_types array"))
return nil, true
}
propertyTypes = append(propertyTypes, uint32(i))
}
}
return propertyTypes, false
}
然后你可以发送这样的东西:
curl -X POST 'http://localhost:4000/url?property_types=1,4,7,12