Skip to main content
 主页 > GMG游戏 >

gmg大联盟最新活动

2024-11-04 14:07 浏览:

中间件在web应用服务中,完整的一个业务处理在技术上包含客户端操作、服务器端处理、返回处理结果给客户端三个步骤 在实际的业务开发和处理中,会有更负责的业务和需求场景一个完整的系统可能要包含鉴权认证、权限管理、安全检查、日志记录等多维度的系统支持。

这些保障和支持系统业务属于全系统的业务,和具体的系统业务没有关联,对于系统中的所有业务都适用可以将这些功能单独抽出来,做成单独的工具,在合适的地方进行调用这种单独的功能被称为中间件,感觉类似于AOP中的面向切面编程和依赖注入。

gin的中间件在gin中 中间件称之为middleware,类型定义如下:typeHandlerFunc(*Context) HGMGandlerFunc 是一个函数类型,接收一个Context参数用于编写程序处理函数并返回HandleFunc类型,作为中间件的定义。

中间件的使用方法funcDefault() *Engine { debugPrintWARNINGDefault() engine := New() engine.Use(Logger(), Recovery())

return engine } //Log中间件funcLogger()HandlerFunc { return LoggerWithConfig(LoggGMGerConfig{}) } //Recovery中间件

funcRecovery()HandlerFunc { return RecoveryWithWriter(DefaultErrorWriter) }在Default函数中,engine调用Use方法设置了Logger中间件和Recovery中间件。

Use函数接收一个可变参数,类型为HandlerFunc,恰为中间件的类型Use方法定义如下:func(engine *Engine)Use(middleware ...HandlerFunc)IRoutes

{ enGMGgine.RouterGroup.Use(middleware...) engine.rebuild404Handlers() engine.rebuild405Handlers()

return engine }自定义中间件可以自己定义实现一个特殊需求的中间件,中间件的类型是函数,有两条标准:* func函数* 返回值类型为HandlerFunc比如,我们自定义一个自己的中间件在上面的内容中,我们在处理请求时,为了方便代码调试,通常都将请求的一些信息打印出来。

有了中间件以后,为了避免代码多次重复编写,使用统一的中间件来完成定义一个名为RequesGMGtInfos的中间件,在该中间件中打印请求的path和method具体代码实现如下所示:funcRequestInfos

Q微:6681122

()gin.HandlerFunc { returnfunc(context *gin.Context) { path := context.FullPath() method := context.Request.Method fmt.Println(

"请求Path:", path) fmt.Println("请求Method:", method) } GMG } funcmain() { engine := gin.Default() engine.Use(RequestInfos()) engine.GET(

"/query", func(context *gin.Context) { context.JSON(200, map[string]interface{}{ "code": 1, "msg"

: context.FullPath(), }) }) engine.Run(":GMG9000") }通过两条fmt.Println打印出了请求的信息,并通过engine.Use使用RequestInfos中间件。

运行程序,能够得到正确地返回JSON格式的数据:{ "code": 1, "msg": "/query" }context.Next函数context.Next函数可以将中间件代码的执行顺序一分为二,Next函数调用之前的代码在请求处理之前之前,当程序执行到context.Next时,会中断向下执行,转而先去执行具体的业务逻辑,执行完业务逻辑处理函数之后,程序会再次回到context.Next处,继续执行GMG中间件后续的代码。

具体用法如下:funcmain() { engine := gin.Default() engine.Use(RequestInfos()) engine.GET("/query", func(context *gin.Context)

{ fmt.Println(" 中间件的使用方法 ") context.JSON(404, map[string]interface{}{ "code": 1, "msg": context.FullPath(), }GMG) }) engine.Run(

":9000") } funcRequestInfos()gin.HandlerFunc { returnfunc(context *gin.Context) { path := context.FullPath() method := context.Request.Method fmt.Println(

"请求Path:", path) fmt.Println("请求Method:", method) GMG context.Next() fmt.Println(context.Writer.Status()) } }

通过打印的顺序可以看到,Next函数将中间件程序的代码执行分为了前后连个部分,Next之前的按照顺序执行,Next之后会在业务逻辑处理完毕后再执行使用中间件实现代理转发功能//该中间件将当前访问转发到本地的8090端口的应用。

funcReverseProxy()gin.HandlerFunc { target := "localhost:8090"returnfunc(c *gin.Context) { GMGdirector :=

func(req *http.Request) { req.URL.Scheme = "http" req.URL.Host = target req.Host = target } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(c.Writer, c.Request) } }

Q微:6681122

上一篇:GMG加入代理

下一篇:gmg官方微博