router.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package api
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "net/http"
  5. )
  6. // Handler 请求处理函数
  7. type Handler func(c *Context)
  8. type Router interface {
  9. AddMiddlewares(middlewares ...Handler) Router
  10. RegisterVersionedRouter(version string, middlewares ...Handler) Router
  11. VersionedRouter(version string) Router
  12. AddRoute(method string, relativePath string, middlewares ...Handler) Router
  13. Static(relativePath string, root string)
  14. StaticFile(relativePath string, filepath string)
  15. BasePath() string
  16. }
  17. type RootRouter struct {
  18. engine *gin.Engine
  19. versioned map[string]*PrefixRouter
  20. }
  21. func newRootRouter(engine *gin.Engine) *RootRouter {
  22. return &RootRouter{
  23. engine: engine,
  24. versioned: make(map[string]*PrefixRouter),
  25. }
  26. }
  27. func (r *RootRouter) AddMiddlewares(middlewares ...Handler) Router {
  28. r.engine.Use(transferHandlers(middlewares...)...)
  29. return r
  30. }
  31. func (r *RootRouter) RegisterVersionedRouter(version string, middlewares ...Handler) Router {
  32. versioned := r.engine.Group(version, transferHandlers(middlewares...)...)
  33. r.versioned[version] = newPrefixRouter(versioned)
  34. return r.versioned[version]
  35. }
  36. func (r *RootRouter) Static(relativePath string, root string) {
  37. r.engine.Static(relativePath, root)
  38. }
  39. func (r *RootRouter) StaticFile(relativePath string, filepath string) {
  40. r.engine.StaticFile(relativePath, filepath)
  41. }
  42. func (r *RootRouter) BasePath() string {
  43. return r.engine.BasePath()
  44. }
  45. func (r *RootRouter) VersionedRouter(version string) Router {
  46. return r.versioned[version]
  47. }
  48. func (r *RootRouter) AddRoute(method string, relativePath string, middlewares ...Handler) Router {
  49. r.engine.Handle(method, relativePath, transferHandlers(middlewares...)...)
  50. return r
  51. }
  52. func (r *RootRouter) ServerHttp(w http.ResponseWriter, req *http.Request) {
  53. r.engine.ServeHTTP(w, req)
  54. }
  55. type PrefixRouter struct {
  56. groupRouter *gin.RouterGroup
  57. versioned map[string]*PrefixRouter
  58. }
  59. func newPrefixRouter(group *gin.RouterGroup) *PrefixRouter {
  60. return &PrefixRouter{
  61. groupRouter: group,
  62. versioned: make(map[string]*PrefixRouter),
  63. }
  64. }
  65. func (r *PrefixRouter) AddMiddlewares(middlewares ...Handler) Router {
  66. r.groupRouter.Use(transferHandlers(middlewares...)...)
  67. return r
  68. }
  69. func (r *PrefixRouter) RegisterVersionedRouter(version string, middlewares ...Handler) Router {
  70. ginMiddlewares := make([]gin.HandlerFunc, 0)
  71. for _, m := range middlewares {
  72. innerM := m
  73. ginMiddlewares = append(ginMiddlewares, func(c *gin.Context) {
  74. innerM(&Context{Context: c})
  75. })
  76. }
  77. versioned := r.groupRouter.Group(version, ginMiddlewares...)
  78. r.versioned[version] = newPrefixRouter(versioned)
  79. return r.versioned[version]
  80. }
  81. func (r *PrefixRouter) VersionedRouter(version string) Router {
  82. return r.versioned[version]
  83. }
  84. func (r *PrefixRouter) AddRoute(method string, relativePath string, middlewares ...Handler) Router {
  85. r.groupRouter.Handle(method, relativePath, transferHandlers(middlewares...)...)
  86. return r
  87. }
  88. func (r *PrefixRouter) Static(relativePath string, root string) {
  89. r.groupRouter.Static(relativePath, root)
  90. }
  91. func (r *PrefixRouter) StaticFile(relativePath string, filepath string) {
  92. r.groupRouter.StaticFile(relativePath, filepath)
  93. }
  94. func (r *PrefixRouter) BasePath() string {
  95. return r.groupRouter.BasePath()
  96. }
  97. func transferHandlers(handlers ...Handler) []gin.HandlerFunc {
  98. ginHandlers := make([]gin.HandlerFunc, 0)
  99. for _, handler := range handlers {
  100. innerHandler := handler
  101. ginHandlers = append(ginHandlers, func(c *gin.Context) {
  102. innerHandler(&Context{Context: c})
  103. })
  104. }
  105. return ginHandlers
  106. }