vRp.CD2g_test/server/http_wrapper.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)...),
}
}