2

gin快速入门

 3 years ago
source link: https://studygolang.com/articles/33448
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

gin框架快速入门

gin

golang的一个微框架,对api友好,灵活,没有orm等, 其没有工具,需要手工创建文件及目录,和beego相比没有完整的mvc架构,也没有orm等

安装

go get github.com/gin-gonic/gin

运行与热加载

  1. 一般使用go run main.go 。默认为8080端口
  2. 也可以使用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)
    
}

路由抽离,自动加载

  1. 利用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()
}

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK