gin/request/wrapper.go

329 lines
7.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package request ...
//
// Description : gin ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-12-29 15:10
package request
import (
"git.zhangdeman.cn/zhangdeman/gin/define"
"git.zhangdeman.cn/zhangdeman/gin/request/parse_body"
"git.zhangdeman.cn/zhangdeman/wrapper"
"github.com/gin-gonic/gin"
"strings"
"sync"
)
var (
WrapperHandle = &wrapperHandle{}
)
type wrapperHandle struct {
}
// GetHeader 读取header
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:22 2023/12/25
func (wh *wrapperHandle) GetHeader(ctx *gin.Context, headerKey string, defaultVal string) string {
if nil == ctx {
return defaultVal
}
val := ctx.GetHeader(headerKey)
return wrapper.TernaryOperator.String(len(val) > 0, wrapper.String(val), wrapper.String(defaultVal)).Value()
}
// GetCookie 读取cookie
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 21:23 2023/12/25
func (wh *wrapperHandle) GetCookie(ctx *gin.Context, cookieName string, defaultVal string) string {
if nil == ctx {
return ""
}
val, err := ctx.Cookie(cookieName)
if nil != err {
return defaultVal
}
return wrapper.TernaryOperator.String(len(val) > 0, wrapper.String(val), wrapper.String(defaultVal)).Value()
}
// GetUri 获取请求URI
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:13 2023/12/29
func (wh *wrapperHandle) GetUri(ctx *gin.Context, defaultVal string) string {
if nil != ctx && nil != ctx.Request && nil != ctx.Request.URL {
return ctx.Request.URL.Path
}
return defaultVal
}
// GetScheme 获取scheme
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:16 2024/1/2
func (wh *wrapperHandle) GetScheme(ctx *gin.Context, defaultVal string) string {
if nil != ctx && nil != ctx.Request && nil != ctx.Request.URL {
return ctx.Request.URL.Scheme
}
return defaultVal
}
// ParseQuery 获取query参数
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:03 2024/1/2
func (wh *wrapperHandle) ParseQuery(ctx *gin.Context) map[string]string {
query := make(map[string]string)
if nil != ctx && nil != ctx.Request && nil != ctx.Request.URL {
for paramName, valueList := range ctx.Request.URL.Query() {
if len(valueList) == 0 {
query[paramName] = ""
} else {
query[paramName] = valueList[0]
}
}
return query
}
return query
}
// GetMethod 获取请求方法
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:19 2024/1/2
func (wh *wrapperHandle) GetMethod(ctx *gin.Context) string {
if nil != ctx && nil != ctx.Request {
return ctx.Request.Method
}
return ""
}
// GetContentType 获取请求方式
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:24 2023/12/29
func (wh *wrapperHandle) GetContentType(ctx *gin.Context, defaultVal string) string {
if nil == ctx {
return defaultVal
}
contentTypeVal := strings.ToLower(ctx.ContentType())
return wrapper.TernaryOperator.String(len(contentTypeVal) > 0, wrapper.String(contentTypeVal), wrapper.String(defaultVal)).Value()
}
// GetDomain 获取请求Domain
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:12 2024/9/19
func (wh *wrapperHandle) GetDomain(ctx *gin.Context) string {
if nil == ctx {
return ""
}
return ctx.Request.Host
}
// ParseBody 获取请求body
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:25 2024/7/26
func (wh *wrapperHandle) ParseBody(ctx *gin.Context) map[string]any {
body := map[string]any{}
if _, err := parse_body.Execute(ctx, &body); nil != err {
return map[string]any{}
}
return body
}
// GetResponseBody 获取响应body
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:18 2024/1/2
func (wh *wrapperHandle) GetResponseBody(ctx *gin.Context, key string, defaultVal any) any {
if nil == ctx {
return defaultVal
}
if val, exist := ctx.Get(key); !exist || nil == val {
return defaultVal
} else {
return val
}
}
// GetClientIp 获取请求客户端IP
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:31 2024/7/23
func (wh *wrapperHandle) GetClientIp(ctx *gin.Context, defaultVal string) string {
if nil == ctx {
return defaultVal
}
return ctx.ClientIP()
}
// GetUserAgent 获取user_agent
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:32 2024/7/23
func (wh *wrapperHandle) GetUserAgent(ctx *gin.Context, defaultVal string) string {
if nil == ctx {
return defaultVal
}
return ctx.Request.UserAgent()
}
// GetCtxData 获取请求上下文数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:35 2024/7/23
func (wh *wrapperHandle) GetCtxData(ctx *gin.Context, key string, defaultVal any) any {
if nil == ctx {
return defaultVal
}
if val, exist := ctx.Get(key); !exist || nil == val {
return defaultVal
} else {
return val
}
}
// GetCtxStringData 获取字符串数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:37 2024/7/23
func (wh *wrapperHandle) GetCtxStringData(ctx *gin.Context, key string, defaultVal string) string {
if nil == ctx {
return defaultVal
}
val := ctx.GetString(key)
if len(val) == 0 {
return defaultVal
}
return val
}
// GetCtxIntData 获取int数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:39 2024/7/23
func (wh *wrapperHandle) GetCtxIntData(ctx *gin.Context, key string, defaultVal int64) int64 {
if nil == ctx {
return defaultVal
}
val := wh.GetCtxData(ctx, key, nil)
if nil == val {
return defaultVal
}
return ctx.GetInt64(key)
}
// ParseHeader 解析header数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:04 2024/9/23
func (wh *wrapperHandle) ParseHeader(ctx *gin.Context) map[string]string {
headerData := map[string]string{}
if nil == ctx || nil == ctx.Request {
return headerData
}
for headerName, headerVal := range ctx.Request.Header {
if len(headerVal) > 0 {
headerData[headerName] = headerVal[0]
} else {
headerData[headerName] = ""
}
}
return headerData
}
// ParseCookie 解析cookie数据
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:06 2024/9/23
func (wh *wrapperHandle) ParseCookie(ctx *gin.Context) map[string]string {
cookieData := map[string]string{}
if nil == ctx || nil == ctx.Request {
return cookieData
}
for _, itemCookie := range ctx.Request.Cookies() {
cookieData[itemCookie.Name] = itemCookie.Value
}
return cookieData
}
// Copy 复制context
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 11:00 2025/2/28
//
// - ctx *gin.Context 基于哪一个context复制context
// - isCopyContextValue bool : 是否继承父级ctx的自定义value
func (wh *wrapperHandle) Copy(ctx *gin.Context, isCopyContextValue bool, excludeKeyList []string) *gin.Context {
if nil == ctx {
return nil
}
newContext := ctx.Copy()
excludeKeyTable := map[string]bool{}
for _, excludeKey := range excludeKeyList {
excludeKeyTable[excludeKey] = true
}
if isCopyContextValue {
// 上下文设置的业务数据值也继承下来, TODO: 并发读写此处可能panic
for k, v := range newContext.Keys {
if !excludeKeyTable[k] {
// 没有指定不继承
ctx.Set(k, v)
}
}
}
// 设置父级context
ctx.Set("parent_context", ctx)
if nil == ctx.Value("root_context") {
ctx.Set("root_context", ctx)
}
return newContext
}
// GetLogicAfterResponse ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 16:54 2025/2/28
func (wh *wrapperHandle) GetLogicAfterResponse(ctx *gin.Context) *define.LogicAfterResponse {
if nil == ctx || nil == ctx.Request {
return nil
}
l, exist := ctx.Get(define.LogicAfterResponseKey)
if !exist || nil == l {
l = &define.LogicAfterResponse{
SuccessHookFuncList: make([]func(), 0),
FailureHookFuncList: make([]func(), 0),
Lock: &sync.RWMutex{},
}
ctx.Set(define.LogicAfterResponseKey, l)
}
// 就这么写, key值如果被其他人覆盖成非法值, 此处会直接panic
return l.(*define.LogicAfterResponse)
}