| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- package webx
-
- import (
- "net/http"
- )
-
- // HandlerFunc 通用的处理器函数类型
- type HandlerFunc interface{}
-
- // Router 路由器
- type Router struct {
- mux *http.ServeMux
- globalBefore []func(http.Handler) http.Handler
- globalAfter []func(http.ResponseWriter, *http.Request)
- }
-
- func NewRouter(mux *http.ServeMux) *Router {
- return &Router{
- mux: mux,
- }
- }
-
- // UseBefore 在处理器前执行的中间件
- func (r *Router) UseBefore(middleware ...func(http.Handler) http.Handler) *Router {
- r.globalBefore = append(r.globalBefore, middleware...)
- return r
- }
-
- // UseAfter 在处理器后执行的中间件
- func (r *Router) UseAfter(middleware ...func(http.ResponseWriter, *http.Request)) *Router {
- r.globalAfter = append(r.globalAfter, middleware...)
- return r
- }
-
- // GET 注册 GET 请求
- func (r *Router) GET(path string, handler HandlerFunc) *routeBuilder {
- return r.handle("GET", path, handler)
- }
-
- // POST 注册 POST 请求
- func (r *Router) POST(path string, handler HandlerFunc) *routeBuilder {
- return r.handle("POST", path, handler)
- }
-
- // handle 内部处理方法
- func (r *Router) handle(method, path string, handler HandlerFunc) *routeBuilder {
- return &routeBuilder{
- router: r,
- method: method,
- path: path,
- handler: handler,
- }
- }
-
- // 路由构建器
- type routeBuilder struct {
- router *Router
- method string
- path string
- handler HandlerFunc
- before []func(http.Handler) http.Handler
- after []func(http.ResponseWriter, *http.Request)
- description string
- }
-
- // Before 添加路由前中间件
- func (rb *routeBuilder) Before(middleware ...func(http.Handler) http.Handler) *routeBuilder {
- rb.before = append(rb.before, middleware...)
- return rb
- }
-
- // After 添加路由后中间件
- func (rb *routeBuilder) After(middleware ...func(http.ResponseWriter, *http.Request)) *routeBuilder {
- rb.after = append(rb.after, middleware...)
- return rb
- }
-
- // Desc 添加描述
- func (rb *routeBuilder) Desc(desc string) *routeBuilder {
- rb.description = desc
- return rb
- }
-
- // Register 注册路由
- func (rb *routeBuilder) Register() {
- // 创建最终的 HTTP 处理器
- finalHandler := rb.createHandler()
-
- // 应用路由级 before 中间件
- for i := len(rb.before) - 1; i >= 0; i-- {
- finalHandler = rb.before[i](finalHandler)
- }
-
- // 应用全局 before 中间件
- for i := len(rb.router.globalBefore) - 1; i >= 0; i-- {
- finalHandler = rb.router.globalBefore[i](finalHandler)
- }
-
- // 注册到 ServeMux
- rb.router.mux.Handle(rb.path, finalHandler)
- }
-
- // 创建处理器
- func (rb *routeBuilder) createHandler() http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
- // 方法检查
- if rb.method != "" && req.Method != rb.method {
- http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
- return
- }
-
- // 创建上下文
- ctx := req.Context()
-
- // 执行处理器
- rb.invokeHandler(ctx, w, req)
-
- // 执行路由级 after 中间件
- for _, after := range rb.after {
- after(w, req)
- }
-
- // 执行全局 after 中间件
- for _, after := range rb.router.globalAfter {
- after(w, req)
- }
- })
- }
|