// Package response ... // // Description : response ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2022-06-25 20:52 package response import ( "fmt" "net/http" "runtime" "strconv" "strings" "time" "git.zhangdeman.cn/zhangdeman/exception" "git.zhangdeman.cn/zhangdeman/gin/define" "github.com/gin-gonic/gin" ) const ( // hasSendResponseFlag 已经发送响应数据的标识, 一旦识别到, 重复调用不会执行 hasSendResponseFlag = "GIN_PKG_HAS_SEND_RESPONSE" ) var ( // 成功的业务状态码 successBusinessCode any = "200" ) // SetBusinessSuccessCode 设置成状态码 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:01 2024/8/17 func SetBusinessSuccessCode(code any) { successBusinessCode = code } // Success 成功的响应 // // Author : go_developer@163.com<白茶清欢> // // Date : 22:37 2022/6/25 func Success(ctx *gin.Context, data any) { successException := exception.NewSuccess(data) Send(ctx, successException.GetCode(), successException.GetHttpCode(), successException.GetData(), nil) } // SuccessWithExtension 返回扩展数据 // // Author : go_developer@163.com<白茶清欢> // // Date : 14:52 2024/9/24 func SuccessWithExtension(ctx *gin.Context, data any, extension map[string]any) { successException := exception.NewSuccess(data) Send(ctx, successException.GetCode(), successException.GetHttpCode(), successException.GetData(), extension) } // Send 基础的发送数据 // // Author : go_developer@163.com<白茶清欢> // // Date : 22:40 2022/6/25 func Send(ctx *gin.Context, code any, httpCode int, data any, extension map[string]any) { // 设置请求是否成功的标识 ctx.Set(define.GetHttpHandleConfig().RequestIsSuccessField, fmt.Sprintf("%v", code) == fmt.Sprintf("%v", successBusinessCode)) if ctx.GetBool(hasSendResponseFlag) { // 已经发送过数据, 后面在发送数据, 不执行 return } finishRequestTime := time.Now().UnixMilli() // 设置数据已发送的标识 defer ctx.Set(hasSendResponseFlag, true) responseConfig := define.GetHttpHandleConfig() responseData := map[string]any{ responseConfig.ResponseCodeField: code, responseConfig.ResponseMessageField: exception.GetMessage(code), responseConfig.ResponseTraceIDField: ctx.GetString(responseConfig.ResponseTraceIDField), responseConfig.ResponseDataField: data, responseConfig.HandleRequestCostField: finishRequestTime - ctx.GetInt64(responseConfig.StartRequestTimeField), } if responseConfig.EnableExtensionOutput && nil != extension { responseData[responseConfig.ExtensionOutputField] = extension } // 记录完成时间 ctx.Set(responseConfig.FinishRequestTimeField, finishRequestTime) ctx.Set(responseConfig.ResponseDataField, responseData) responseException := exception.New(code, httpCode, responseData) ctx.JSON(responseException.GetHttpCode(), responseException.GetData()) } // SendWithStatusOK ... // // Author : go_developer@163.com<白茶清欢> // // Date : 22:41 2022/6/25 func SendWithStatusOK(ctx *gin.Context, code any, data any) { Send(ctx, code, http.StatusOK, data, nil) } // SendWithException 使用exception发送数据 // // Author : go_developer@163.com<白茶清欢> // // Date : 13:08 2022/6/26 func SendWithException(ctx *gin.Context, e exception.IException, data any) { if nil == e { e = exception.NewSuccess(data) } if !define.GetHttpHandleConfig().DisableDebugStackOutput { pcs := make([]uintptr, 128) n := runtime.Callers(2, pcs) frames := runtime.CallersFrames(pcs[:n]) var sb strings.Builder for { frame, more := frames.Next() sb.WriteString(frame.Function) sb.WriteByte('\n') sb.WriteByte('\t') sb.WriteString(frame.File) sb.WriteByte(':') sb.WriteString(strconv.Itoa(frame.Line)) sb.WriteByte('\n') if !more { break } } fmt.Println(sb.String()) } outputData := map[string]any{ "e_data": e.GetData(), "u_e_data": data, } Send(ctx, e.GetCode(), e.GetHttpCode(), outputData, nil) } // JSON ctx.JSON 的平替, 增加了数据是否已相应的标识 // // Author : go_developer@163.com<白茶清欢> // // Date : 14:51 2023/2/15 func JSON(ctx *gin.Context, httpCode int, data any) { if ctx.GetBool(hasSendResponseFlag) { // 已经发送过数据, 后面在发送数据, 不执行 return } // 设置数据已发送的标识 defer ctx.Set(hasSendResponseFlag, true) ctx.JSON(httpCode, data) }