GIN的路由以及传参问题
1.路由:
func main() {
r := gin.Default()
r.GET("/ping/:name", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": c.Param("name"),
})
fmt.Println(c.Param("name"))
})
r.Run() // listen and serve on 0.0.0.0:8080
}
以冒号的形式设置url参数的话可以通过,对应的参数可以通过context.Param的形式获得。但是存在问题 无法导向/ping本身
func main() {
r := gin.Default()
r.GET("/ping/*name", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": c.Param("name"),
})
fmt.Println(c.Param("name"))
})
r.Run() // listen and serve on 0.0.0.0:8080
}
这里就存在另一种参数形式,也就是*,每次获得的参数都将包含/,也可以作用于/ping,如果当前的路由中不存在/ping的处理形式,将会自动跳转到/ping/并交给/ping/*name处理
并且/ping/*name与/ping/:name存在冲突,不能同时写入路由。
2.传参
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
":message": c.Query("name"),
})
})
r.Run() // listen and serve on 0.0.0.0:8080
}
当get传参的时候(url上显示的参数)
可以通过Context.Query来获得对应的value,如果需要判断是否为空,则可以使用Context.getQuery更加优雅,也可以使用Context.DefaultQuery类似于java中map的getOrDefault
当POST传参的时候(请求写入body)
可以通过Context.PostForm来获得对应的value,如果需要判断是否为空,则可以使用Context.getPostForm更加优雅,也可以使用Context.DefaultPostForm类似于java中map的getOrDefault。
但是测试的时候发现,似乎这个方法不像SpringMVC中的RequestBody可以获取对应的JSON,这里的操作会有些复杂,需要通过流,读取Body,并且转换成JSON,通过map读取对应的参数
var user map[string]interface{}
body, _ := ioutil.ReadAll(req.Body)
json.Unmarshal(body, &user)
fmt.Println("获取json中的username:", user["username"])
fmt.Println("获取json中的password:", user["password"].(string)) //转字符串通过len(password)!=0判断长度
以上时大致方法,这里先提出一个疑问,看看后面的学习中是否能解决,不能直接通过中间件实现一个读取转化,从SpringMVC来看 这不是一个很难的轮子。
到此这篇关于GIN的路由以及传参问题的文章就介绍到这了,更多相关GIN路由及传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Go语言结构体(Struct)和接口(Interface)详解
本文主要介绍了Go语言结构体(Struct)和接口(Interface),详解其定义、匿名字段、值/指针接收器等特性,探讨接口的隐式实现、类型断言及组合应用,下面就一起来了解一下2025-09-09
golang使用sync.singleflight解决热点缓存穿透问题
在go的sync包中,有一个singleflight包,里面有一个 singleflight.go文件,代码加注释,一共200行出头,通过 singleflight可以很容易实现缓存和去重的效果,避免重复计算,接下来我们就给大家详细介绍一下sync.singleflight如何解决热点缓存穿透问题2023-07-07


最新评论