登录
首页 >  Golang >  Go问答

如何在Golang中使用Gin获取GET请求查询字符串中的数组参数?

来源:stackoverflow

时间:2024-02-19 14:18:25 306浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《如何在Golang中使用Gin获取GET请求查询字符串中的数组参数?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我正在使用 gin 来实现原始的 php api。目前网上有类似这样的请求

/路径?a[]=1&a[]=2&b[0]=1&b[1]=2&c[0][年龄]=1&c[0][姓名]=abc

如何在gin中获取这样的数组参数?

获取如下值:

a=["1", "2"]
b=["1", "2"]
c=[{"age": "1", "name": "abc"}]

好像gin不支持这个参数。有没有优雅的方法来获取这些参数?


解决方案


参考github上的这个Pull Request,我找到了一个可能的解决方案来获取像a[]=1&a[]=2这样的参数:

golang 代码:

// return an array
a, _ := ctx.getqueryarray("a[]") // or just use queryarray("a[]") directly.
ctx.json(200, gin.h{
    "a[]": a,
})

&b[0]=1&b[1]=2这样的参数,您可以直接使用querymap(但这不会返回数组):

// return a map.
ctx.json(200, gin.h{
    "b": ctx.querymap("b"),
})

我认为没有直接的方法可以用map获取数组。我对gin.context(硬代码)中的get的源代码做了一些更改:

var dicts []map[string]string
key := "a"
queryMap := ctx.Request.URL.Query()
//log.Println(dicts) // dicts[0] except
for k, v := range queryMap {
    if i:= strings.IndexByte(k, '['); i >= 1 && k[0:i] == key{
        if j := strings.IndexByte(k[i+1:], ']'); j >= 1{
            index, _ := strconv.Atoi(k[i+1: i+j+1]) // get the index of slice
            if index > len(dicts){
                ctx.JSON(200, gin.H{
                    "403": "Check your data",
                })
                return
            }
            if index == len(dicts){
                tmp := make(map[string]string)
                dicts = append(dicts, tmp)
            }
            pre :=strings.IndexByte(k[i+j+2:], '[')
            last:=strings.IndexByte(k[i+j+2:], ']')
            dicts[index][k[i+j+3+pre: i+j+2+last]] = v[0]
        }
    }
}
ctx.JSON(200, gin.H{
    "a": dicts,
})

示例: 当数据越界时:

好了,本文到此结束,带大家了解了《如何在Golang中使用Gin获取GET请求查询字符串中的数组参数?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>