gin学习过程要点总结

gin作为golang的一个框架,一直以轻便,高效深受开发者的喜爱,他的路由性能比martin高40倍。溢美之词到此为止,下面正式开始撸代码,从基本的获取gin的源码开始。

首先,从github上获取gin的源码:

go get github.com/gin-gonic/gin

然后在代码中使用import引入就可以使用了。

gin支持常用的get,post,put,delete等方式。

最基本的api:

func main(){
	r:=gin.Default()//创建包含日志等模块的gin的引擎实例
	r.GET("/ping",func(c *gin.Context){//创建一个get请求的api,第一个参数是url,第二个参数是匿名函数
		c.JSON(http.StatusOK,gin.H{"message":"wang"})
	})
	r.Run()
}

第二个参数的匿名函数中gin.Context是gin中最重要的部分,主要用来传递参数,验证request请求,以及返回json的response。

在get请求的第一个参数是url,也相当于路由,gin的路由来着httprouter,但是gin不支持路由正则表达式。

参数传递:路由传递

r.GET("/mytest/:name",func(c *gin.Context ){
		na:=c.Param("name")
		c.JSON(http.StatusOK,gin.H{"message":na})

	})

在http参数传递中,web提供的客户端向服务器端发送请求时参数传递的方式除了路由传递,还有query string和body两种。

参数传递:query string传递

所谓的参数传递方式就是指在路由后面加上?username=zhangsan&age>20这种方式。在gin中如何获取对应的值就是关键

r.GET("/myquery",func(c *gin.Context){
   username:=c.Query("username")
   age:=c.DefaultQuery("age","20")
   fmt.Println(username,age)
})
请求的url为http://localhost:8080/myquery?username=wang,返回结果wang,20
请求的url为http://localhost:8080/myquery?username=wang&age=,返回结果wang

请求的url为http://localhost:8080/myquery?username=wang&age=29,返回结果wang 29
所以如果有age参数,但是值为空,也代表有值。DefaultQuery方法是在age不存在时才使用默认值。

参数传递:body传递

body传递参数的方式有四种,application/jsonapplication/x-www-form-urlencodedapplication/xmlmultipart/form-data

最后一种是用来上传文件的。默认情况下gin解析post提交的方式就是第二种,就是把query string放到body里面然后进行url编码。一般用body传递的也都是post请求,gin中有单独的post处理方式。

r.POST("/login",func(c *gin.Context){
   username:=c.PostForm("username")
   password:=c.PostForm("password")
   verifycode:=c.DefaultPostForm("verifycode","2999")
   fmt.Println(username,password,verifycode)
})

模板加载

在web开发中肯定要用到html文件,gin提供了c.html()方法来加载html文件。但是需要事先定义好模板文件的路径

r.LoadHTMLGlob("template/*")//此处加载html路径只能指定一次,如果指定多次只有最后一次有效

r.LoadHTMLGlob("view/*")此处重新设置了html的路径,所以template中的html就无法起作用。
r.LoadHTMLGlob("template/**/*")此处匹配两层文件夹,即template下文件夹的文件
r.GET("/fuck",func(c *gin.Context){
c.HTML(http.StatusOK,"fuck.html",gin.H{})})

重定向:

在http中重定向是301,gin中有直接重定向的方法,c.Redirect(301,“”)第二个参数就是重定向之后的路由地址。

r.GET("/dbn",func(c *gin.Context){
   //c.HTML(http.StatusOK,"dbn.html",gin.H{})
   c.Redirect(301,"/hello")
   //c.JSON(http.StatusOK,gin.H{"sk":"dfd"})
})
分组路由:

分组路由的主要应用在于不同的业务需要不同的路径,有明确的区分,例如admin与user两个角色都有相应的login操作,

这时可以进行设置分组路由。

v1:=r.Group("/v1")
v1.GET("/vvv",func(c *gin.Context){
   c.JSON(http.StatusOK,gin.H{"wang":"wang"})
})
v2:=r.Group("/v2")
v2.GET("/vvv",func(c *gin.Context){
   c.JSON(http.StatusOK,gin.H{"beijing":"wang"})
})
访问的时候url:http://localhost:8080/v2/vvv或者http://localhost:8080/v1/vvv



中间件:

所谓的中间件就是指把原有的代码封装进新的函数中调用。

单个路由使用中间件

func middlewarestudy() gin.HandlerFunc{
   return func(c *gin.Context){
      fmt.Println("before middleware")
      c.Set("username","wongcony")
      c.Next()
      fmt.Println("before middleware")
   }
}

r.GET("/fly",middlewarestudy(),func(c *gin.Context){//这时在路由中直接使用中间件
      vv:=c.MustGet("username").(string)
      vv2,_:=c.Get("username")
      c.JSON(200,gin.H{"vv":vv,"vv2":vv2})
})
与此相反,可以把很多个路由封装进一个路由中。
r.Use(middlewarestudy())//路由封装到一块使用中间件,但是在此后在使用r的时候都默认注册了中间件
{
   r.GET("/middle",func(c *gin.Context){
      vv:=c.MustGet("username").(string)
      vv2,_:=c.Get("username")
      c.JSON(200,gin.H{"vv":vv,"vv2":vv2})
   })
}

r.GET("/first",func(c *gin.Context){
   vv:=c.MustGet("username").(string)
   vv2,_:=c.Get("username")
   c.JSON(200,gin.H{"vv":vv,"vv2":vv2})
})
群组中间件:

与单个中间件类似,只需要在群组函数中注册中间件即可

v2:=r.Group("/v2",middlewarestudy())

总结:

总的来说gin常用的知识点就这么多,剩下的不过是在此基础上查缺补漏,还需要在项目实践中不断的总结归纳gin的使用

方法,性能优势和缺陷。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值