137 lines
5.0 KiB
Go
137 lines
5.0 KiB
Go
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)...),
|
|
}
|
|
}
|