gin快速入门

mafa1993 · · 697 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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

本文来自:简书

感谢作者:mafa1993

查看原文:gin快速入门

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

697 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传