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来看 这不是一个很难的轮子。

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值