欢迎访问宙启技术站
智能推送

golang实现路由中间件middleware

发布时间:2023-05-15 08:22:07

在Golang中实现路由中间件(middleware),可以让我们对请求进行加工和拦截,方便我们对请求进行更精准的处理,本文将介绍如何在Golang中实现路由中间件。

一、什么是路由中间件

路由中间件是指在请求到达路由处理器之前,对请求进行拦截和加工的功能模块,一般是一些独立的函数或结构体,通过继承路由的控制权,并修改其中的参数或属性来实现对请求的操作。

在Golang中,路由中间件可以结合第三方框架(如Gin、Echo、Beego等)使用,也可以自己手写实现,以下是手写实现的例子。

二、手写路由中间件

假设我们有一个简单的GET请求如下:

http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
}

现在我们想通过路由中间件在请求处理之前添加一些日志和校验,我们可以这样实现:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", logMiddleware(handler))
    http.ListenAndServe(":8080", nil)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
}

func logMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("logMiddleware: ", r.URL.Path)
        next(w, r)
    }
}

我们通过logMiddleware函数将请求处理器handler传递进去,并在里面添加打印请求路径的功能。

现在访问http://localhost:8080,我们可以看到控制台打印出了logMiddleware: /,证明路由中间件生效了。

这样的路由中间件,我们也可以叠加使用,比如我们再写一个校验的路由中间件:

func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("authMiddleware: ", r.URL.Path)

        username, password, ok := r.BasicAuth()
        if !ok || username != "admin" || password != "123456" {
            w.WriteHeader(http.StatusUnauthorized)
            fmt.Fprintln(w, "Unauthorized")
            return
        }
        next(w, r)
    }
}

这个authMiddleware将会校验用户名和密码,只有校验成功之后才会执行原始的请求处理器。

我们在main函数中叠加使用它们:

http.HandleFunc("/", authMiddleware(logMiddleware(handler)))

这样,我们就实现了两个简单的路由中间件。

三、结合Gin框架使用路由中间件

如果我们使用Gin框架来实现路由中间件,相对于手写会更加方便简洁,以下是一个使用Gin框架的例子:

package main

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

func main() {
    r := gin.Default()

    r.Use(tokenAuthMiddleware, logMiddleware)

    r.GET("/", func(c *gin.Context) {
        c.String(200, "Hello, World!")
    })

    r.Run()
}

func tokenAuthMiddleware(c *gin.Context) {
    token := c.Request.Header.Get("Authorization")
    if token != "123456" {
        c.AbortWithStatus(401)
        return
    }
    c.Next()
}

func logMiddleware(c *gin.Context) {
    println("logMiddleware: ", c.Request.URL.Path)
    c.Next()
}

我们在use函数中将tokenAuthMiddleware和logMiddleware添加到请求的处理链中,Gin框架会自动调用这些中间件,我们只需要在中间件中进行处理即可。

四、总结

路由中间件的作用是在请求到达处理器之前,对请求进行加工和拦截,能够方便我们对请求进行更精准的处理。

在Golang中,我们可以手写实现路由中间件,也可以使用第三方框架来实现。无论是手写还是框架实现,路由中间件都能够帮助我们更方便地处理请求。