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/json,application/x-www-form-urlencoded, application/xml和multipart/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())






浙公网安备 33010602011771号