Gin 基本操作 | 青训营笔记

79 阅读2分钟

Gin 基本操作

1. 安装

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

2. Hello World

package main

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

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on
}

3. 路由

3.1 概念

路由是一个由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。

3.2 基本路由

package main

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

func main() {
    r := gin.Default()
    // 基本路由
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // listen and serve on
}

3.3 路由参数

  1. 参数作为路径的一部分
package main

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

func main() {
    r := gin.Default()
    // 路由参数
    r.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(200, "Hello %s", name)
    })
    r.Run() // listen and serve on
}
  1. 参数作为查询字符串
package main

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

func main() {
    r := gin.Default()
    // 路由参数
    r.GET("/user", func(c *gin.Context) {
        name := c.Query("name")
        c.String(200, "Hello %s", name)
    })
    r.Run() // listen and serve on
}

3.4 路由组

package main

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

func main() {
    r := gin.Default()
    // 路由组
    v1 := r.Group("/v1")
    {
        v1.GET("/login", func(c *gin.Context) {
            c.String(200, "v1 login")
        })
        v1.GET("/submit", func(c *gin.Context) {
            c.String(200, "v1 submit")
        })
    }
    v2 := r.Group("/v2")
    {
        v2.GET("/login", func(c *gin.Context) {
            c.String(200, "v2 login")
        })
        v2.GET("/submit", func(c *gin.Context) {
            c.String(200, "v2 submit")
        })
    }
    r.Run() // listen and serve on
}

3.5 路由重定向

package main

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

func main() {
    r := gin.Default()
    // 路由重定向
    r.GET("/a", func(c *gin.Context) {
        c.Redirect(301, "/b")
    })
    r.GET("/b", func(c *gin.Context) {
        c.String(200, "b")
    })
    r.Run() // listen and serve on
}

3.6 路由重定向

package main

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

func main() {
    r := gin.Default()
    // 路由重定向
    r.GET("/a", func(c *gin.Context) {
        c.Redirect(301, "/b")
    })
    r.GET("/b", func(c *gin.Context) {
        c.String(200, "b")
    })
    r.Run() // listen and serve on
}

Gin 中间件

1. 概念

中间件(Middleware)是一种设计模式,它提供了一种方便的机制,用于过滤进入应用程序的 HTTP 请求,并在需要时进行修改。Gin 中间件的实质是一种基于高阶函数的设计模式,它接受一个 HandlerFunc 作为参数,并返回一个新的 HandlerFunc。

2. 基本使用

package main

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

func main() {
    r := gin.Default()
    // 中间件
    r.Use(func(c *gin.Context) {
        c.String(200, "hello world")
    })
    r.Run() // listen and serve on
}

3. 中间件分类

3.1 全局中间件

全局中间件将会作用于每一个请求上,它们是按照它们添加的顺序执行的。

package main

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

func main() {
    r := gin.Default()
    // 全局中间件
    r.Use(func(c *gin.Context) {
        c.String(200, "hello world")
    })
    r.Run() // listen and serve on
}

3.2 路由中间件

路由中间件将会作用于一个或者多个路由之上,它们是按照它们添加的顺序执行的。

package main

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

func main() {
    r := gin.Default()
    // 路由中间件
    r.GET("/a", func(c *gin.Context) {
        c.String(200, "a")
    }, func(c *gin.Context) {
        c.String(200, "b")
    })
    r.Run() // listen and serve on
}

3.3 错误中间件

错误中间件是一种专门用来处理错误的中间件,它会在所有中间件之后执行,因此,它应该是所有中间件中最后一个被添加的。

3.4 组中间件

组中间件是附加到路由组的中间件,它们将会作用于该路由组中的所有请求。

package main

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

func main() {
    r := gin.Default()
    // 组中间件
    r.Use(func(c *gin.Context) {
        c.String(200, "hello world")
    })
    v1 := r.Group("/v1")
    {
        v1.GET("/login", func(c *gin.Context) {
            c.String(200, "v1 login")
        })
        v1.GET("/submit", func(c *gin.Context) {
            c.String(200, "v1 submit")
        })
    }
    v2 := r.Group("/v2")
    {
        v2.GET("/login", func(c *gin.Context) {
            c.String(200, "v2 login")
        })
        v2.GET("/submit", func(c *gin.Context) {
            c.String(200, "v2 submit")
        })
    }
    r.Run() // listen and serve on
}