探究gin框架实践(上) | 青训营

105 阅读2分钟

一.gin的中间件

1.中间件的概念

gin框架允许在处理请求时,加入用户自己的钩子函数,该钩子函数即中间件。他的作用与Java中的拦截器,Node中的中间件相似。中间件需要返回gin.HandlerFunc函数,多个中间件通过Next函数来依次执行。

2.基本使用

现在设计一个中间件,在每次路由函数执行前打印一句话,在基础项目上新建middleware文件夹,新建一个中间件文件MyFmt.go

package middleware

import (
    "fmt"
    "github.com/gin-gonic/gin"
)

// 定义一个中间件
func MyFMT() gin.HandlerFunc {
    return func(c *gin.Context) {
        host := c.Request.Host
        fmt.Printf("Before: %s\n",host)
        c.Next()
        fmt.Println("Next: ...")
    }
}

在路由函数中使用定义的中间件:

r.GET("/user/login", middleware.MyFMT(),  userLogin)

打印结果

Before: localhost:8080
Next: ...
[GIN] 2019/07/28 - 16:28:16 | 200 |      266.33µs |             ::1 | GET      /user/login

这里只是基础的运用,更高级的运用建议查看官方文档。

二.请求的拦截与后置

中间件的最大作用就是拦截过滤请求,比如我们有些请求需要用户登录或者需要特定权限才能访问,这时候便可以中间件中做过滤拦截。如果在中间件中调用gin.Context的Next()方法,则可以请求到达并完成业务处理后,再经过中间件后置拦截处理:

func MyMiddleware(c *gin.Context){
    //请求前
    c.Next()
    //请求后
}

1.gin.Engine

Engine是框架的入口,是gin框架的核心,通过Engine对象来定义服务路由信息、组装插件、运行服务。不过Engine的本质只是对内置HTTP服务的包装。 gin.Default() 函数会生成一个默认的 Engine 对象,包含2个默认常用插件。

func Default() *Engine {
    engine := New()
    engine.Use(Logger(), Recovery())
    return engine
}

2.gin.Context

gin.Context内保存了请求的上下文信息,是所有请求处理器的入口参数:

type HandlerFunc func(*Context)

type Context struct {
  ...
  Request *http.Request // 请求对象
  Writer ResponseWriter // 响应对象
  Params Params // URL匹配参数
  ...
  Keys map[string]interface{} // 自定义上下文信息
  ...
}

Context 对象提供了非常丰富的方法用于获取当前请求的上下文信息,如果你需要获取请求中的 URL 参数、Cookie、Header 都可以通过 Context 对象来获取。这一系列方法本质上是对 http.Request 对象的包装。

三.总结

这里只是就gin讲述了一些基础的知识,其他会在下文中讲到。