-
Notifications
You must be signed in to change notification settings - Fork 16
/
http_wrapper.go
136 lines (114 loc) · 5.03 KB
/
http_wrapper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package server
import (
"github.com/gin-gonic/gin"
"net/http"
)
type HttpWrapperHandleFunc[CTX any] func(ctx CTX)
// NewGinWrapper 创建 gin 包装器,用于对 NewHttpWrapper 函数的替代
func NewGinWrapper[CTX any](server *gin.Engine, pack func(ctx *gin.Context) CTX) *HttpWrapper[CTX] {
return &HttpWrapper[CTX]{
server: server,
packHandle: pack,
}
}
// HttpWrapper http 包装器
type HttpWrapper[CTX any] struct {
server *gin.Engine
packHandle func(ctx *gin.Context) CTX
}
// handlersToGinHandlers 将 HttpWrapperHandleFunc 转换为 gin.HandlerFunc
func handlersToGinHandlers[CTX any](packHandle func(ctx *gin.Context) CTX, handlers []HttpWrapperHandleFunc[CTX]) []gin.HandlerFunc {
handles := make([]gin.HandlerFunc, len(handlers))
for i, handle := range handlers {
handles[i] = func(ctx *gin.Context) {
handle(packHandle(ctx))
}
}
return handles
}
// Handle 处理请求
func (slf *HttpWrapper[CTX]) Handle(httpMethod, relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
slf.server.Handle(httpMethod, relativePath, handlersToGinHandlers(slf.packHandle, handlers)...)
return slf
}
// Use 使用中间件
func (slf *HttpWrapper[CTX]) Use(middleware ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
slf.server.Use(handlersToGinHandlers(slf.packHandle, middleware)...)
return slf
}
// GET 注册 GET 请求
func (slf *HttpWrapper[CTX]) GET(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodGet, relativePath, handlers...)
}
// POST 注册 POST 请求
func (slf *HttpWrapper[CTX]) POST(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodPost, relativePath, handlers...)
}
// DELETE 注册 DELETE 请求
func (slf *HttpWrapper[CTX]) DELETE(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodDelete, relativePath, handlers...)
}
// PATCH 注册 PATCH 请求
func (slf *HttpWrapper[CTX]) PATCH(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodPatch, relativePath, handlers...)
}
// PUT 注册 PUT 请求
func (slf *HttpWrapper[CTX]) PUT(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodPut, relativePath, handlers...)
}
// OPTIONS 注册 OPTIONS 请求
func (slf *HttpWrapper[CTX]) OPTIONS(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodOptions, relativePath, handlers...)
}
// HEAD 注册 HEAD 请求
func (slf *HttpWrapper[CTX]) HEAD(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodHead, relativePath, handlers...)
}
// Trace 注册 Trace 请求
func (slf *HttpWrapper[CTX]) Trace(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodTrace, relativePath, handlers...)
}
// Connect 注册 Connect 请求
func (slf *HttpWrapper[CTX]) Connect(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
return slf.Handle(http.MethodConnect, relativePath, handlers...)
}
// Any 注册 Any 请求
func (slf *HttpWrapper[CTX]) Any(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
slf.Handle(http.MethodGet, relativePath, handlers...)
slf.Handle(http.MethodPost, relativePath, handlers...)
slf.Handle(http.MethodDelete, relativePath, handlers...)
slf.Handle(http.MethodPatch, relativePath, handlers...)
slf.Handle(http.MethodPut, relativePath, handlers...)
slf.Handle(http.MethodOptions, relativePath, handlers...)
slf.Handle(http.MethodHead, relativePath, handlers...)
slf.Handle(http.MethodTrace, relativePath, handlers...)
slf.Handle(http.MethodConnect, relativePath, handlers...)
return slf
}
// Match 注册与您声明的指定方法相匹配的路由。
func (slf *HttpWrapper[CTX]) Match(methods []string, relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapper[CTX] {
slf.server.Match(methods, relativePath, handlersToGinHandlers(slf.packHandle, handlers)...)
return slf
}
// StaticFile 注册 StaticFile 请求
func (slf *HttpWrapper[CTX]) StaticFile(relativePath, filepath string) *HttpWrapper[CTX] {
slf.server.StaticFile(relativePath, filepath)
return slf
}
// Static 注册 Static 请求
func (slf *HttpWrapper[CTX]) Static(relativePath, root string) *HttpWrapper[CTX] {
slf.server.Static(relativePath, root)
return slf
}
// StaticFS 注册 StaticFS 请求
func (slf *HttpWrapper[CTX]) StaticFS(relativePath string, fs http.FileSystem) *HttpWrapper[CTX] {
slf.server.StaticFS(relativePath, fs)
return slf
}
// Group 创建一个新的路由组。您应该添加所有具有共同中间件的路由。
func (slf *HttpWrapper[CTX]) Group(relativePath string, handlers ...HttpWrapperHandleFunc[CTX]) *HttpWrapperGroup[CTX] {
return &HttpWrapperGroup[CTX]{
wrapper: slf,
group: slf.server.Group(relativePath, handlersToGinHandlers(slf.packHandle, handlers)...),
}
}