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()
}