Gin框架的大致使用方法(详细)

1、在gin框架中文文档是这么介绍的

Gin 是一个用 Go (Golang) 编写的 web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter,速度提高了近 40 倍。 如果你是性能和高效的追求者,你会爱上 Gin。两款Web框架相比较,Gin自己说他比Martini要强很多。

2、Gin的基本使用方法

首先在项目终端下载安装gin包:

go get -u github.com/gin-gonic/gin

举一个简单的例子:

package main

import "github.com/gin-gonic/gin"

func main() {
    //Default返回一个默认的路由引擎
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) { // /ping是路由
        //输出json结果给调用方
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
  r.Run(":8081") // 可以从本地的127.0.0.1:8081访问,不填的话,默认是8080端口
}

go run main.go 运行程序,打开浏览器访问http://127.0.0.1:8081/ping页面,最终显示:

{"message":"pong"} // 这就是返回给前端的数据

3、Gin框架中的路由使用

  • gin路由,路由的基本使用,按路由组分组处理请求

    package main
    
    import (
       "github.com/gin-gonic/gin"
       "fmt"
    )
    
    // gin的helloWorld
    
    func main() {
       // 1.创建路由
       r := gin.Default()
       // 路由组1 ,处理GET请求
       v1 := r.Group("api/v1")
       // {} 是书写规范
       {
          v1.GET("/register", register)
          v1.GET("login", login)
       }
       v2 := r.Group("api/v2")
       {
          v2.POST("/register", register)
          v2.POST("/login", login)
       }
       r.Run(":8000") // 开启端口在8000
    }
    
    func login(c *gin.Context) {
       name := c.DefaultQuery("name", "jack")
       c.String(http.StatusOK, fmt.Sprintf("hello %s\n", name))
    }
    
    func register(c *gin.Context) {
       name := c.DefaultQuery("name", "lily")
       c.String(http.StatusOK, fmt.Sprintf("hello %s\n", name))
    }
    

    4、gin中的数据绑定

  • gin数据解析和绑定(JSON举例)

    package main
    
    import (
       "github.com/gin-gonic/gin"
       "net/http"
    )
    
    // 定义接收数据的结构体
    type Login struct {
       // binding:"required"修饰的字段,若接收为空值,则报错,是必须字段
       User    string `json:"user" binding:"required"`
       Pssword string `json:"password" binding:"required"`
    }
    
    func main() {
       // 1.创建路由
       r := gin.Default()
       // JSON绑定
       r.POST("loginJSON", func(c *gin.Context) {
          // new结构体,给结构体分配内存
         login := new(Login)
          // 将request的body中的数据,自动按照json格式解析到结构体
          if err := c.ShouldBindJSON(&login); err != nil {
             // 返回错误信息
             // gin.H封装了生成json数据的工具
             c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
             return
          }
          c.JSON(http.StatusOK, gin.H{"status": "200"})
       })
       r.Run(":8000")
    }
    

    5、gin的中间件使用

  • next()方法!

    func myMiddleWare() gin.HandlerFunc {
    	return func(ctx *gin.Context) {
    		fmt.Println("before")
    		ctx.Next()
    		fmt.Println("after")
    	}
    }
    // Next()函数相当于一个分割线,在Next()函数之前的在Handler之前执行,Next()函数之后的在Handler之后执行
    
  • Gin中间件

    // 定义程序计时中间件,然后定义2个路由,执行函数后应该打印统计的执行时间,如下:
    package main
    
    import (
        "fmt"
        "time"
    
        "github.com/gin-gonic/gin"
    )
    
    // 定义中间
    func myTime(c *gin.Context) {
        start := time.Now()
        c.Next()
        // 统计时间
        since := time.Since(start)
        fmt.Println("程序用时:", since)
    }
    
    func main() {
        // 1.创建路由
        // 默认使用了2个中间件Logger(), Recovery()
        r := gin.Default()
        // 注册中间件
        r.Use(myTime)
        // {}为了代码规范
        shoppingGroup := r.Group("/shopping")
        {
            shoppingGroup.GET("/index", shopIndexHandler)
            shoppingGroup.GET("/home", shopHomeHandler)
        }
        r.Run(":8000")
    }
    
    func shopIndexHandler(c *gin.Context) {
        time.Sleep(5 * time.Second)
    }
    
    func shopHomeHandler(c *gin.Context) {
        time.Sleep(3 * time.Second)
    }
    //可以试试 打印结果
    

你可能感兴趣的:(golang,开发语言,后端)