package framework import ( "log" "net/http" "strings" ) type Serve struct { Addr string //Handler Hander } type Core struct { router map[string]*Tree } func NewCore() *Core { router := map[string]*Tree{} router["GET"] = NewTree() router["POST"] = NewTree() router["PUT"] = NewTree() router["DELETE"] = NewTree() return &Core{router: router} } func (c *Core) Get(url string, handler ControllerHandler) { if err := c.router["GET"].AddRouter(url, handler); err != nil { log.Fatal("add router error: ", err) } } func (c *Core) POST(url string, handler ControllerHandler) { if err := c.router["POST"].AddRouter(url, handler); err != nil { log.Fatal("add router error: ", err) } } func (c *Core) PUT(url string, handler ControllerHandler) { if err := c.router["PUT"].AddRouter(url, handler); err != nil { log.Fatal("add router error: ", err) } } func (c *Core) DELETE(url string, handler ControllerHandler) { if err := c.router["DELETE"].AddRouter(url, handler); err != nil { log.Fatal("add router error: ", err) } } func (c *Core) ServeHTTP(w http.ResponseWriter, r *http.Request) { log.Println("core.serveHTTP") ctx := NewContext(r, w) // 寻找路由 router := c.FindRouteByRequest(r) if router == nil { // 如果没有找到,这里打印日志 ctx.Json(404, "not found") return } // 调用路由函数,如果返回err 代表存在内部错误,返回500状态码 if err := router(ctx); err != nil { ctx.Json(500, "inner error") return } } func (c *Core) FindRouteByRequest(request *http.Request) ControllerHandler { uri := request.URL.Path method := request.Method upperMethod := strings.ToUpper(method) upperUri := strings.ToUpper(uri) if methodHandlers, ok := c.router[upperMethod]; ok { return methodHandlers.FindHandler(upperUri) } return nil }