Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик аккаунт, просьба указывать источник перепечатываемой статьи.
В сегодняшней статье поговорим о промежуточном программном обеспечении фреймворка Gin (middleware
), следует сказать, что промежуточное ПО Gin является очень важной частью среды Gin, а промежуточное ПО Gin также является неотъемлемой частью разработки полной веб-программы с использованием среды Gin, поэтому необходимо иметь хорошее понимание.
Что такое ПО промежуточного слоя Джин
Что такое промежуточное ПО Gin? Какова роль промежуточного программного обеспечения Gin? Как использовать промежуточное ПО?
1. Роль промежуточного ПО Gin
Проще говоря, промежуточное ПО Gin выполняет две роли:
-
Прежде чем веб-запрос достигнет определенного нами метода обработки HTTP-запроса, перехватите запрос и обработайте его соответствующим образом (например, проверка авторизации, фильтрация данных и т. д.), что может быть аналогично
前置拦截器
или前置过滤器
, -
Когда мы обрабатываем выполненный запрос и отвечаем клиенту, перехватываем ответ и обрабатываем его соответствующим образом (например: добавляем унифицированный заголовок ответа или формат данных и т. д.), который может быть типа
后置拦截器
или后置过滤器
.
2. Определение промежуточного программного обеспечения Gin
В среде Gin определение типа промежуточного программного обеспечения показано в следующем коде.Можно видеть, что промежуточное программное обеспечение на самом деле представляет собой функцию с gin.Context в качестве формального параметра, который по существу совпадает с обработчиком, который мы определяем для обработки. HTTP-запросы — никакой тайны.
type HandlerFunc func(*Context)
3. Встроенное промежуточное ПО Gin
При использовании фреймворка Gin для разработки веб-приложений часто необходимо настраивать промежуточное ПО. Однако Gin также имеет некоторое встроенное промежуточное ПО, которое мы можем использовать напрямую. Ниже приведен список встроенного промежуточного ПО:
func BasicAuth(accounts Accounts) HandlerFunc
func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc
func Bind(val interface{}) HandlerFunc //拦截请求参数并进行绑定
func ErrorLogger() HandlerFunc //错误日志处理
func ErrorLoggerT(typ ErrorType) HandlerFunc //自定义类型的错误日志处理
func Logger() HandlerFunc //日志记录
func LoggerWithConfig(conf LoggerConfig) HandlerFunc
func LoggerWithFormatter(f LogFormatter) HandlerFunc
func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc
func Recovery() HandlerFunc
func RecoveryWithWriter(out io.Writer) HandlerFunc
func WrapF(f http.HandlerFunc) HandlerFunc //将http.HandlerFunc包装成中间件
func WrapH(h http.Handler) HandlerFunc //将http.Handler包装成中间件
использовать между
1. Не используйте промежуточное ПО по умолчанию
использоватьgin.Default()
возвращениеgin.Engine
используется по умолчаниюRecovery
иLogger
промежуточное ПО, снизуgin.Default()
Исходный код метода можно увидеть:
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())//使用Recovery和Logger中间
return engine
}
Если мы не хотим использовать эти два промежуточных ПО, мы можем использовать метод gin.New() для возврата объекта gin.Engine без промежуточного ПО:
router := gin.New()//不带中间件
2. Используйте промежуточное ПО глобально
Используйте прямую тягуgin.Engine
структурныйUse()
метод для применения промежуточного программного обеспечения ко всем запросам, и таким образом промежуточное программное обеспечение будет работать глобально.
router := gin.New()
router.Use(gin.Recovery())//在全局使用内置中间件
3. Маршрутизируйте пакеты с помощью промежуточного программного обеспечения
Чаще мы будем делить его по разным делам路由分组(RouterGroup )
, Различные группы маршрутизации применяют разное промежуточное ПО, поэтому разные запросы перехватываются и обрабатываются разным промежуточным ПО.
router := gin.New()
user := router.Group("user", gin.Logger(),gin.Recovery())
{
user.GET("info", func(context *gin.Context) {
})
user.GET("article", func(context *gin.Context) {
})
}
4. Используйте промежуточное ПО для одного маршрута
В дополнение к маршрутизации пакетов, маршрутизации отдельных запросов также может применяться промежуточное ПО следующим образом:
router := gin.New()
router.GET("/test",gin.Recovery(),func(c *gin.Context){
c.JSON(200,"test")
})
Также возможно использовать несколько промежуточных программ в одном маршруте следующим образом:
router := gin.New()
router.GET("/test",gin.Recovery(),gin.Logger(),func(c *gin.Context){
c.JSON(200,"test")
})
пользовательское промежуточное ПО
В приведенном выше объяснении мы видим, что, хотя Gin предоставляет некоторое промежуточное ПО, мы можем использовать его напрямую, но встроенное промежуточное ПО может не соответствовать потребностям развития нашего бизнеса.В процессе разработки нам нужно открыть собственное промежуточное ПО, которое есть в Gin framework очень простая вещь.
На переднем плане мы видели, что все методы промежуточного программного обеспечения, поставляемые с инфраструктурой Gin, возвращаютHandlerFunc
тип, который определяется следующим образом:
type HandlerFunc func(*Context)
HandlerFunc стандартизирует определение промежуточного программного обеспечения Gin, поэтому настройте промежуточное программное обеспечение следующим образом:
//定义中间件
func MyMiddleware(c *gin.Context){
//中间件逻辑
}
После определения промежуточного программного обеспечения можно использовать промежуточное программное обеспечение, которое показано здесь глобально, а также может использоваться в одном маршруте или группе маршрутов:
router = gin.Default()
router.Use(MyMiddleware)
Или с помощью пользовательского метода вернуть функцию промежуточного программного обеспечения, что является более распространенным способом в среде Gin:
//定义一个返回中间件的方法
func MyMiddleware(){
//自定义逻辑
//返回中间件
return func(c *gin.Context){
//中间件逻辑
}
}
Используйте собственное промежуточное ПО, обратите внимание на круглые скобки после метода MyMiddleware:
router = gin.Default()
router.Use(MyMiddleware())
Обмен данными
После того, как мы перехватим и предварительно обработаем данные в промежуточном программном обеспечении, как мы передадим данные в метод HTTP, который мы определили для обработки запроса? можно использоватьgin.Context
серединаSet()
метод, который определяется следующим образом:Set()
Какой тип данных хранится через ключ, который удобно получить для следующего метода обработки слоя.
func (c *Context) Set(key string, value interface{})
Когда мы устанавливаем некоторые значения через метод Set в промежуточном программном обеспечении, в следующем слое промежуточного программного обеспечения или методах обработки HTTP-запросов, мы можем использовать перечисленные ниже методы для получения соответствующих данных через ключ.
Среди них метод Get gin.Context возвращаетinterface{}
, вы можете определить, существует ли ключ, вернув файл exists.
func (c *Context) Get(key string) (value interface{}, exists bool)
Когда мы решим установить значение соответствующего типа данных с помощью метода Set, мы можем использовать следующий метод, чтобы получить значение соответствующего типа данных.
func (c *Context) GetBool(key string) (b bool)
func (c *Context) GetDuration(key string) (d time.Duration)
func (c *Context) GetFloat64(key string) (f64 float64)
func (c *Context) GetInt(key string) (i int)
func (c *Context) GetInt64(key string) (i64 int64)
func (c *Context) GetString(key string) (s string)
func (c *Context) GetStringMap(key string) (sm map[string]interface{})
func (c *Context) GetStringMapString(key string) (sms map[string]string)
func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string)
func (c *Context) GetStringSlice(key string) (ss []string)
func (c *Context) GetTime(key string) (t time.Time)
Образец кода:
//自定义中间件
func MyMiddleware(c *gin.Context){
c.Set("mykey",10)
}
router := gin.New()
router.GET("test",MyMiddleware,func(c *gin.Context){
c.GetInt("mykey")//我们知道设置进行的是整型,所以使用GetInt方法来获取
})
Перехват запросов и пост-перехват
1. Перехватить запрос
Мы уже говорили, что самая большая роль промежуточного программного обеспечения заключается в перехвате и фильтрации запросов. Например, некоторые из наших запросов требуют входа пользователя или определенных разрешений для доступа. В настоящее время мы можем фильтровать и перехватывать промежуточное программное обеспечение. Когда пользовательские запросы являются незаконными, мы можем использовать следующие столбцыgin.Context
Несколько методов прерывания пользовательских запросов:
После того, как следующие три метода прерывают запрос, сразу возвращается 200, но в теле ответа данных не будет.
func (c *Context) Abort()
func (c *Context) AbortWithError(code int, err error) *Error
func (c *Context) AbortWithStatus(code int)
С помощью метода AbortWithStatusJSON() после прерывания запроса пользователя можно вернуть данные в формате json.
func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{})
2. После перехвата
Мы говорили о перехвате до достижения определенного нами метода обработки HTTP.На самом деле, если мы вызовем его в промежуточном программном обеспеченииgin.Context
изNext()
метод, вы можете запросить прибытие и завершение бизнес-обработки, а затем пройти обработку промежуточного программного обеспечения после перехвата,Next()
Метод определяется следующим образом: .
func (c *Context) Next()
вызов промежуточного программного обеспеченияNext()
метод,Next()
Код перед методом будет выполняться до достижения метода запроса,Next()
Код после выполнения метода после обработки метода запроса:
func MyMiddleware(c *gin.Context){
//请求前
c.Next()
//请求后
}
образец кода
func MyMiddleware(c *gin.Context){
c.Set("key",1000)//请求前
c.Next()
c.JSON(http.StatusOK,c.GetInt("key"))//请求后
}
router := gin.New()
router.GET("test", MyMiddleware, func(c *gin.Context) {
k := c.GetInt("key")
c.Set("key", k+2000)
})
router.Run()
Текущий результат приведенного выше примера программы — 3000. С помощью такого простого примера программы, приведенного выше, мы можем увидеть роль промежуточного программного обеспечения в запросах на перехват запросов, обработку данных и управление процессом веб-запросов.
резюме
Изучите фреймворк Gin, промежуточное ПОmiddleware
Очень важное знание, оно может перехватывать незаконные HTTP-запросы до того, как мы определим метод обработки HTTP-запросов, или предварительно обработаем данные, или добавим в ответ унифицированный заголовок ответа, поэтому при использовании Gin для разработки веб-приложений требуется промежуточное ПО. знание.
Ваше внимание — самое большое поощрение на моем писательском пути!