core.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package framework
  2. import (
  3. "log"
  4. "net/http"
  5. "strings"
  6. )
  7. // 核心框架
  8. type Core struct {
  9. router map[string]*Tree
  10. }
  11. // 初始化框架核心结构
  12. func NewCore() *Core {
  13. // 初始化路由
  14. router := map[string]*Tree{}
  15. router["GET"] = NewTree()
  16. router["POST"] = NewTree()
  17. router["PUT"] = NewTree()
  18. router["DELETE"] = NewTree()
  19. return &Core{router: router}
  20. }
  21. // 对应 Method = GET
  22. func (c *Core) Get(url string, handler ControllerHandler) {
  23. if err := c.router["GET"].AddRouter(url, handler); err != nil {
  24. log.Fatal("add router error: ", err)
  25. }
  26. }
  27. // 对应 Method = POST
  28. func (c *Core) Post(url string, handler ControllerHandler) {
  29. if err := c.router["POST"].AddRouter(url, handler); err != nil {
  30. log.Fatal("add router error: ", err)
  31. }
  32. }
  33. // 对应 Method = PUT
  34. func (c *Core) Put(url string, handler ControllerHandler) {
  35. if err := c.router["PUT"].AddRouter(url, handler); err != nil {
  36. log.Fatal("add router error: ", err)
  37. }
  38. }
  39. // 对应 Method = DELETE
  40. func (c *Core) Delete(url string, handler ControllerHandler) {
  41. if err := c.router["DELETE"].AddRouter(url, handler); err != nil {
  42. log.Fatal("add router error: ", err)
  43. }
  44. }
  45. // 匹配路由,如果没有匹配到,返回 nil
  46. func (c *Core) FindRouteByRequest(request *http.Request) ControllerHandler {
  47. // uri 和 method 全部转换为大写, 保证大小写不敏感
  48. uri := request.URL.Path
  49. method := request.Method
  50. upperMethod := strings.ToUpper(method)
  51. // 查找第一层 map
  52. if methodHandlers, ok := c.router[upperMethod]; ok {
  53. // 查找第二层 map
  54. return methodHandlers.FindHandler(uri)
  55. }
  56. return nil
  57. }
  58. // 初始化 Group
  59. func (c *Core) Group(prefix string) IGroup {
  60. return NewGroup(c, prefix)
  61. }
  62. // 框架核心结构实现 handler 接口
  63. func (c *Core) ServeHTTP(response http.ResponseWriter, request *http.Request) {
  64. log.Println("core.ServeHTTP")
  65. // 封装自定义 context
  66. ctx := NewContext(request, response)
  67. // 寻找路由
  68. router := c.FindRouteByRequest(request)
  69. if router == nil {
  70. ctx.Json(404, "not found")
  71. return
  72. }
  73. // 调用跌幅函数,如果返回 err 代表存在内部错误,返回 500 状态码
  74. if err := router(ctx); err != nil {
  75. ctx.Json(500, "inner error")
  76. return
  77. }
  78. log.Println("core.router")
  79. }