Веб-фреймворк Gin | Промежуточное ПО Gin

задняя часть Go

​Это 14-й день моего участия в августовском испытании обновлений.Подробности о мероприятии:Испытание августовского обновления

Промежуточное программное обеспечение является очень важным понятием в Golang.Подобно перехватчикам в Java, оно часто используется для улучшения масштабируемости приложений и оставляет больше места для расширения, такого как ведение журнала, обработка ошибок и другие функции.

Во всей реализации Gin промежуточное ПО является сущностью Gin. Каждое промежуточное ПО формирует цепочку промежуточного ПО, перехватывает запросы HTTP-запросов, реализует развязку и разделение кода, причем промежуточное ПО не знает друг о друге, каждому промежуточному ПО нужно заниматься только тем, с чем ему нужно иметь дело.

Обзор промежуточного программного обеспечения Gin

В исходном примере мы напрямую передалиgin.Default()для инициализации объекта gin, который содержит промежуточное ПО по умолчанию*Engine.

Среди них функция Default () по умолчанию связывает два подготовленных промежуточных программного обеспечения, это Logger и Recovery, которые помогают нам печатать вывод журнала и обработку боли.

// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
	debugPrintWARNINGDefault()
	engine := New()
	engine.Use(Logger(), Recovery())
	return engine
}

Из приведенной выше функции Default() мы видим, что промежуточное ПО Gin устанавливается с помощью метода Use, который представляет собой переменный параметр, который может одновременно устанавливать несколько промежуточных программ.

// Use attaches a global middleware to the router. ie. the middleware attached though Use() will be
// included in the handlers chain for every single request. Even 404, 405, static files...
// For example, this is the right place for a logger or error management middleware.
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
	engine.RouterGroup.Use(middleware...)
	engine.rebuild404Handlers()
	engine.rebuild405Handlers()
	return engine
}

Глядя на это, легко понять, что промежуточное программное обеспечение Gin на самом деле является функциональной функцией, определенной Gin, и тип возвращаемого значения этой функции:HandlerFunc.

Реализация промежуточного программного обеспечения

Промежуточное программное обеспечение в основном используется для выполнения некоторых общих функций, что удобно для расширения функций и унифицированной реализации, аналогичной фильтру.

Из приведенного выше введения для реализации промежуточного программного обеспечения вам нужно только выполнить следующие два пункта:

  • это функция
  • Тип возвращаемого значения функции должен бытьHandlerFunc

Пример:

Реализация вычисляет время, необходимое для выполнения каждого запроса.

package main

import (
	"fmt"
	"time"

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

func main() {
	// 初始化gin对象
	route := gin.Default()

	// 中间件注册
	route.Use(costTimeMiddleware())

	// 设置一个get请求,其URL为/hello,并实现简单的响应
	route.GET("/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "hello world!",
		})
	})

	// 启动服务
	route.Run()
}

func costTimeMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 请求前获取当前时间
		nowTime := time.Now()

		// 请求处理
		c.Next()

		// 请求处理完获取花费的时间
		costTime := time.Since(nowTime)

		requestURL := c.Request.URL.String()
		fmt.Printf("the request URL %s cost %v\n", requestURL, costTime)
	}
}

Среди них c.Next() разрешено использовать только в функциях промежуточного программного обеспечения для приостановки обработки бизнес-логики запроса. Чтобы лучше понять выполнение функций промежуточного программного обеспечения, функции промежуточного программного обеспечения можно разделить на три уровня:

gin中间件函数执行流程

По месту регистрации ПО промежуточного слоя делится на:

  • глобальное промежуточное ПО: все запросы проходят через это промежуточное ПО. Например, приведенный выше пример относится к глобальному промежуточному программному обеспечению.

  • локальное промежуточное ПО: Действительно только для зарегистрированных маршрутов. Если промежуточное ПОcostTimeMiddlewareЕсли он зарегистрирован в следующем месте, он принадлежит локальному промежуточному ПО и действует только для запроса /hello.

    route.GET("/hello", costTimeMiddleware(), func(c *gin.Context) {
    	c.JSON(200, gin.H{
    		"message": "hello world!",
    	})
    })
    
    

Общее промежуточное ПО

Вы можете обратиться к:contrib, который содержит много часто используемого промежуточного программного обеспечения.