// Package router ... // // Description : router ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2025-11-01 12:34 package router import ( "git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/gin/define" "git.zhangdeman.cn/zhangdeman/gin/logger" "git.zhangdeman.cn/zhangdeman/gin/util" pkgLogger "git.zhangdeman.cn/zhangdeman/logger" "github.com/gin-gonic/gin" ) // hook 执行hook逻辑 func (s *server) hook(ctx *gin.Context, uriCfg UriConfig) { responseAfter, exist := ctx.Get(consts.GinLogicAfterResponseKey) innerContext := util.GinCtxToContext(ctx) if !exist || nil != responseAfter { // 未配置 logger.Instance.Debug("未配置Logic执行后的hook逻辑", pkgLogger.NewLogData(innerContext, logger.RecordType, logger.CodeLogicHook, map[string]any{ "uri": uriCfg.Path, "logic_after_response_key": consts.GinLogicAfterResponseKey, }).ToFieldList()...) return } isSuccess, exist := ctx.Get(consts.GinRequestSuccess) success := false if nil != isSuccess && (isSuccess == "1" || isSuccess == "true" || isSuccess.(bool)) { success = true } hookInstance := responseAfter.(*define.LogicAfterResponse) if uriCfg.HookSync { // 同步执行 s.hookAfter(ctx, uriCfg, hookInstance, success) } else { // 异步执行 go s.hookAfter(ctx, uriCfg, hookInstance, success) } } func (s *server) hookAfter(ctx *gin.Context, uriCfg UriConfig, hookInstance *define.LogicAfterResponse, success bool) { innerContext := util.GinCtxToContext(ctx) defer func() { if err := recover(); err != nil { logger.Instance.Error("hook执行异常", pkgLogger.NewLogData(innerContext, logger.RecordType, logger.CodeLogicHook, map[string]any{ "uri": uriCfg.Path, "logic_after_response_key": consts.GinLogicAfterResponseKey, "error": err.(error).Error(), "logic_success": success, }).ToFieldList()...) } else { } }() if success { logger.Instance.Debug("接口Logic执行成功, 执行Hook逻辑") for _, itemFunc := range hookInstance.SuccessHookFuncList { if nil != itemFunc { itemFunc(ctx) } } } else { for _, itemFunc := range hookInstance.FailureHookFuncList { if nil != itemFunc { itemFunc(ctx) } } } }