Tanggungjawab perisian tengah Golang boleh dipasang dan berdikari Fungsinya ialah: 1. Dalam proses memproses permintaan, memintas, memproses atau menapis permintaan, dan boleh melakukan beberapa operasi sebelum dan selepas memproses permintaan. seperti pengelogan, pengesahan, pemprosesan parameter permintaan, dan lain-lain penulisan kod.
Persekitaran pengendalian tutorial ini: sistem Windows 10, GO versi 1.20.1, komputer Dell G3.
Peranan perisian tengah Golang
Tanggungjawab utama perisian tengah ialah boleh dipasang dan berdikari. Semasa proses memproses permintaan, permintaan dipintas, diproses atau ditapis, dan beberapa operasi boleh dilakukan sebelum dan selepas memproses permintaan, seperti pengelogan, pengesahan, pemprosesan parameter permintaan, dsb. Middleware boleh memisahkan logik perniagaan dan meminta pemprosesan dalam struktur kod, menjadikan kod lebih jelas dan lebih mudah untuk diselenggara. Pada masa yang sama, perisian tengah boleh digunakan semula, mengurangkan beban kerja penulisan kod berulang.
Contoh kod adalah seperti berikut:
package main import ( "fmt" "github.com/devfeel/dotweb" ) func main() { app := dotweb.New() // App注册中间件 app.Use(NewSessionAuth()) // 开启SESSION app.HttpServer.SetEnabledSession(true) // 设置路由 输出字符串 Hello Dotweb app.HttpServer.GET("/", func(ctx dotweb.Context) error { method := ctx.Request().Method return ctx.WriteString("Hello Dotweb\n" + "Method:" + method) }) //开启服务 端口号 fmt.Println("dotweb.StartServer => 8080") err := app.StartServer(8080) fmt.Println("dotweb.StartServer error => ", err) } // SessionAuth 结构体 type SessionAuth struct { dotweb.BaseMiddlware } // Handle 处理程序 func (m *SessionAuth) Handle(ctx dotweb.Context) error { fmt.Println("SessionID = ", ctx.SessionID(), " RequestURI = ", ctx.Request().RequestURI) return m.Next(ctx) } // NewSessionAuth New func NewSessionAuth() *SessionAuth { sAuth := new(SessionAuth) return sAu }
Bilakah Handle dipanggil?
Mari kita lihat kod sumber BaseMiddlWare:
// BaseMiddleware is the base struct, user defined middleware should extend this type BaseMiddleware struct { next Middleware excludeRouters map[string]struct{} } func (bm *BaseMiddleware) SetNext(m Middleware) { bm.next = m } func (bm *BaseMiddleware) Next(ctx Context) error { httpCtx := ctx.(*HttpContext) if httpCtx.middlewareStep == "" { httpCtx.middlewareStep = middleware_App } if bm.next == nil { if httpCtx.middlewareStep == middleware_App { httpCtx.middlewareStep = middleware_Group if len(httpCtx.RouterNode().GroupMiddlewares()) > 0 { return httpCtx.RouterNode().GroupMiddlewares()[0].Handle(ctx) } } if httpCtx.middlewareStep == middleware_Group { httpCtx.middlewareStep = middleware_Router if len(httpCtx.RouterNode().Middlewares()) > 0 { return httpCtx.RouterNode().Middlewares()[0].Handle(ctx) } } if httpCtx.middlewareStep == middleware_Router { return httpCtx.Handler()(ctx) } } else { // check exclude config if ctx.RouterNode().Node().hasExcludeMiddleware && bm.next.HasExclude() { if bm.next.ExistsExcludeRouter(ctx.RouterNode().Node().fullPath) { return bm.next.Next(ctx) } } return bm.next.Handle(ctx) } return n }
Melalui kod ini kita mungkin dapat melihat bahawa BaseMiddleware sebenarnya adalah senarai terpaut middlewares nod yang membentuk senarai terpaut, dan terdapat jenis yang berbeza, termasuk perisian tengah Kumpulan dan perisian tengah biasa memutuskan perisian tengah yang hendak dipanggil berdasarkan langkah pemprosesan semasa ctx Akhirnya, pengendali ctx dipanggil Perisian tengah tersuai
dan laksanakan pemegangnya. Pengepala yang diluluskan Nilai tanda di dalam hendaklah konsisten dengan uri + SecretKey dalam fail konfigurasi, iaitu md5
Atas ialah kandungan terperinci Apakah peranan middleware golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!