G

[Golang]Gin框架 3.查询参数

RoLingG 2023-06-12

1.查询参数 query

func _query(context *gin.Context) {
//①context.Query
//获取数据,只能获取单个数据,http://127.0.0.1/query?user=RoLingG&user=temp
//因此只有单个数据:RoLingG,无temp
    fmt.Println(context.Query("user"))

//②context.GetQuery
//不能以是否为空字符串判断有无传递数据,返回值一个是string值,一个是ok值
//只能获取单个数据,http://127.0.0.1/query?user=RoLingG&user=temp
//因此只有单个数据:RoLingG,无temp   
    fmt.Println(context.GetQuery("user"))

//③context.QueryArray
////能同时获取多个相同传入的数据,返回值是string类型的切片,http://127.0.0.1/query?user=RoLingG&user=temp
    fmt.Println(context.QueryArray("user"))

//④context.QueryMap
//http://127.0.0.1/query?user[id]=1&user[name]=RoLingG
//运行结果为map[id:1 name:RoLingG],这里key是user,返回值是map[string]string  
//访问路径包括问号后面的都是查询参数,不只有get是这样的
    fmt.Println(context.QueryMap("user"))

//⑤context.DefaultQuery
//如果用户没传值过去,则用默认值
    fmt.Println(context.DefaultQuery("age", "20"))
}

func main() {
    router := gin.Default()    //创建一个默认的路由,并赋予给router
    router.GET("/query", _query)    //访问路径:param/xxx/luoxiangshuoxingfa ←这个就叫访问路径
    router.Run(":80")
}

2.动态参数 param

△之所以叫动态参数是因为其路径是可以被改变的

func _param(context *gin.Context) {
    fmt.Println(context.Param("user_id"))
    fmt.Println(context.Param("book_id"))
}

func main() {
    router := gin.Default()    //创建一个默认的路由,并赋予给router

    router.GET("/param/:user_id", _param)    //http://127.0.0.1/param/xxx    
    //返回:[GIN] 2023/05/27 - 15:20:58 | 200 |        0s |     127.0.0.1 | GET   "/param/xxx"
    //xxx能有什么符号都行,但是不能有路径符“/”

    router.GET("/param/:user_id/:book_id", _param) //http://127.0.0.1/param/xxx/Single    
    //返回:[GIN] 2023/05/27 - 15:23:33 | 200 |    306µs |     127.0.0.1 | GET   "/param/xxx/Single"
    //*路径谁在前,谁就先被数据匹配。例如本例子user_id在book_id前,那么数据会先匹配给user_id*
    router.Run(":80")
}

3.表单参数 postform

func _postform(context *gin.Context) {
    fmt.Println(context.PostForm("name")) //这个不能接收文件是因为它的返回值是String类型的。
                              //能接收form-data以及x-www-form-urlencoded,同参数名的只会被传第一个
    fmt.Println(context.PostFormArray("name"))    //同参数名的会被一起传过去
    fmt.Println(context.DefaultPostForm("age", "20")) //如果用户没有传值过去,则用默认值
    mtforms, err := context.MultipartForm()           //可以接收所用的form参数,包括文件
    fmt.Println(mtforms, err)
}
 func main() {
    router := gin.Default()    //创建一个默认的路由,并赋予给router
    router.POST("/postform", _postform)
    router.Run(":80")
}

4.原始参数 getrawdata(还有其他参数的解析,但不常用)

(1)未封装版

func _rawdata(context *gin.Context) {
//未封装的json解析函数
    body, _ := context.GetRawData()
    contentType := context.GetHeader("Content-Type") //form-data、x-www-form-urlencoded和json都分别对应了它们各自的type
    fmt.Println(contentType)    //打印header类型
    switch contentType {    //识别不同类型header做出不同逻辑
        case "application/json": //只有为json类型数据post时才能接收到数据
        //解析json结构体
        type User struct {
            Name string `json:"name"`
            Age  int    `json:"age"`
        }
        var user User
        err := json.Unmarshal(body, &user) //会返回以一个err判断是否解析成功    
    //按类型解析,例如上面的User结构体中Name的json tag从name变成了name1,而apipost过去的是name,则不能解析。
        if err != nil {
            fmt.Println(err.Error())
        }
        fmt.Println(user)    //打印解析后json结构体(只有解析的结构体数据会出现)
        fmt.Println(string(body))    //打印原始传入的json结构体(有一些没有解析的结构体数据也会出现)
}

    //fmt.Println(string(body)) //在x-www-form-urlencoded下是以url编码形式构成的
    // form-data是以↓这种形式构成的(我不是很知道)
    //Content-Disposition: form-data; name="name"
    //
    //RoLingG

    //json形式    apipost里怎么写的就怎么传过来的
    //{
    //    "name": "RoLingG",
    //    "age": "20"
    //}

}

 func main() {
    router := gin.Default()    //创建一个默认的路由,并赋予给router
    router.POST("/rawdata", _rawdata)
    router.Run(":80")
}

(2)封装版

func _rawdata(context *gin.Context) {
    type User struct {
        Name string `json:"name"`
        Age  int    `json:"age"`
        Addr string `json:"addr"`
    }
    var user User
    err := bindJson(context, &user)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(user)
    fmt.Println(context.GetRawData())
}
// 封装json结构体解析,any可以换为interface{} ←泛型(两个都是),用泛型是为了接收多类型的问题
func bindJson(context *gin.Context, obj any) (err error) {
    body, _ := context.GetRawData()

    contentType := context.GetHeader("Content-Type") 
    //form-data、x-www-form-urlencoded和json都分别对应了它们各自的type

    fmt.Println(contentType)
    switch contentType {
    case "application/json": //只有为json类型数据post时才能接收到数据
        //解析json结构体
        err := json.Unmarshal(body, &obj) //会返回以一个err判断是否解析成功,按类型解析。
        //例如上面的User结构体中Name的json tag从name变成了name1,而apipost过去的是name,则不能解析。

        if err != nil {
            fmt.Println(err.Error())
            return err
        }
    }
    return nil
}
 func main() {
    router := gin.Default()    //创建一个默认的路由,并赋予给router
    router.POST("/rawdata", _rawdata)
    router.Run(":80")
}
PREV
[Golang]Gin框架 5. 请求头参数获取
NEXT
[Vue基础] Vue本人学习路程

评论(0)

发布评论