gin快速入门
2011 年 1 月 3 日
gin框架快速入门
gin
golang的一个微框架,对api友好,灵活,没有orm等, 其没有工具,需要手工创建文件及目录,和beego相比没有完整的mvc架构,也没有orm等
安装
go get github.com/gin-gonic/gin
运行与热加载
- 一般使用go run main.go 。默认为8080端口
- 也可以使用beego的工具bee进行运行,实现热加载 main.go 目录下 bee run
路由
r.GET("/login/:name",login) //name为利用变量接收 r.POST("/login",func (c *gon.Context) { c.String(200,"post login") }) func login(c *gin.Context) { name := c.Param("name") // 接收变量 age := c.Query("age") // query string接收 post_data := c.PostForm("mseeage") // 获取表单数据 post_data_default := c.DefaultPostForm("nick","abc") // 如果没有设置默认值为abc c.JSON(2oo,gin.H{ "code":200, "name":name, "age":age }) } // 路由分组 // 请求的地址为/v1/login/name?age=xxx v1 := r.Group("/v1") { // 用来标记为一个代码块,增加可读性,无其他作用 v1.GET("/login/:name",login) }
路由抽离,自动加载
- 利用go的自动注册,实现,当需要使用goods模块时,加载goods模块下的路由文件,当使用order模块时,加载order模块下的路由
// 每个模块下创建对应的路由文件 ,例如order目录存放order 模块 order/route.go package order func init() { // 初始化时候进行路由的注册 route.RegisterRoute(Routes) // 把需要注册的传递进去 } func Routes(g *gin.Engine) { g.GET("/get",func () { fmt.Println("123") }) } //创建route.go 主文件,用于加载路由 package route // 自动注册的类型 type Router func(*gin.Engine) var routers = []Router{} // 记录自动注册的操作 func RegisterRoute(routes ...Router) { // 这里三个点代表不定传参 routers = append(routers,routes...) // 把切片展开追缴到数组中 } func InitRouter() *gin.Engine { r := gin.Default() for _,route := range routers { route(r) // 加载路由 } return r } // main 中 // 需要引入order,从而执行他的init方法,加载路由 // 也可以再封装一层, route.InitRouter() app.Run();
中间件
package main func main() { r := gin.Default(); r.Use(InitApp) // 使用中间件, 使用多个中间件就写多个use,先写哪个限制性哪个 r.GET("/index",func(c *gin.Context) { c.Json(200, gin.H{ "code":200, "data":"abc" }) }) // 设置路由 r.Run() } // 全局定义,作用在路由之前 func InitApp() gin.HandlerFunc { return func(c *gin.Context){ fmt.Println("中间件") } } func Loginc() gin.HandlerFunc { return func(c *gin.Context){ fmt.Println("中间件 开始") c.Next() // 需要执行的实际route,类似于laravel中间件的next(),不加这个指挥回字形中间件操作,不执行后续操作 fmt.Println("中间件 结束") } } // 只给某个路由使用中间件 r.GET("/a",Auth(),func(c *gin.Context){}) func Auth() gin.Handler { return func(c *gin.Context){ fmt.Println("中间件") } }
表单验证
package main import "github.comgin-gonic/gin/" // 根据请求发送的json数据解析 type Goods struct { Id int GoodsName string `form "name" json:"name" binding:"required" // binding为添加验证规则,form为指定对应form的字段` GoodsPrice string `json :"price",binding:“required,gt=10”` // 多个验证条件 GoodNum int `json:"num"` } // 自定义验证器 var numCheck validator.Func = func(fl validator.FieldLevel) bool { fmt.Println("abc") field,_ := fl.Field().Interface().(int) return true; } func main() { r := gin.Default() // 初始化gin框架 //自定义验证器注册, 注册以后就可以在binding中使用了,这里注册的为numCheck if v,ok := binding.Validator.Engine().(*validator.Validate); ok { v.RegisterValidation("numCheck",numCheck) } r.GET("/index",func(c *gin.Context) { c.Json(200, gin.H{ "code":200, "data":"abc" }) }) // 设置路由 r.POST("/goods",func(c *gin.Context) { var json Goods if err := c.ShouldBindJson(&json); // shouldbindjson 是接收json数据格式使用,ShouldBind用来接收表单数据 err != nil { c.JSON(http.StatusBadRequest, gin.H{"error":err.Error()}) return } fmt.Println(json) c.JSON(200,gin.H{ "code":200, "data":json }) }) r.Run() }
有疑问加站长微信联系(非本文作者)