| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- package framework
- import (
- "log"
- "net/http"
- "strings"
- )
- // 核心框架
- 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}
- }
- // 对应 Method = GET
- func (c *Core) Get(url string, handler ControllerHandler) {
- if err := c.router["GET"].AddRouter(url, handler); err != nil {
- log.Fatal("add router error: ", err)
- }
- }
- // 对应 Method = POST
- func (c *Core) Post(url string, handler ControllerHandler) {
- if err := c.router["POST"].AddRouter(url, handler); err != nil {
- log.Fatal("add router error: ", err)
- }
- }
- // 对应 Method = PUT
- func (c *Core) Put(url string, handler ControllerHandler) {
- if err := c.router["PUT"].AddRouter(url, handler); err != nil {
- log.Fatal("add router error: ", err)
- }
- }
- // 对应 Method = DELETE
- func (c *Core) Delete(url string, handler ControllerHandler) {
- if err := c.router["DELETE"].AddRouter(url, handler); err != nil {
- log.Fatal("add router error: ", err)
- }
- }
- // 匹配路由,如果没有匹配到,返回 nil
- func (c *Core) FindRouteByRequest(request *http.Request) ControllerHandler {
- // uri 和 method 全部转换为大写, 保证大小写不敏感
- uri := request.URL.Path
- method := request.Method
- upperMethod := strings.ToUpper(method)
- // 查找第一层 map
- if methodHandlers, ok := c.router[upperMethod]; ok {
- // 查找第二层 map
- return methodHandlers.FindHandler(uri)
- }
- return nil
- }
- // 初始化 Group
- func (c *Core) Group(prefix string) IGroup {
- return NewGroup(c, prefix)
- }
- // 框架核心结构实现 handler 接口
- func (c *Core) ServeHTTP(response http.ResponseWriter, request *http.Request) {
- log.Println("core.ServeHTTP")
- // 封装自定义 context
- ctx := NewContext(request, response)
- // 寻找路由
- router := c.FindRouteByRequest(request)
- if router == nil {
- ctx.Json(404, "not found")
- return
- }
- // 调用跌幅函数,如果返回 err 代表存在内部错误,返回 500 状态码
- if err := router(ctx); err != nil {
- ctx.Json(500, "inner error")
- return
- }
- log.Println("core.router")
- }
|