• Golang-Gin Response 统一返回restful格式的数据


    目的: gin返回restful格式的数据,返回的200,201 的数据 也包括异常时的404/500等情况
    全局统一返回RESTful风格数据,主要是实现Respon接口的方法,对返回值在输出之前进行修改。

    直接调用下文代码即可

    第一种方式

    点击展开
    package response
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    // Response
    // context 上下文
    // httpStatus http 状态码
    // code 自己定义的状态码
    // data 返回的空接口
    // msg 返回的信息
    func Response(context *gin.Context, httpStatus int, code int, data gin.H, msg string) {
    	context.JSON(httpStatus, gin.H{
    		"code": code,
    		"data": data,
    		"msg":  msg,
    	})
    }
    
    func Success(context *gin.Context, data gin.H, msg string) {
    	context.JSON(http.StatusOK, gin.H{
    		"code": 200,
    		"data": data,
    		"msg":  msg,
    	})
    }
    
    func Fail(context *gin.Context, data gin.H, msg string) {
    	context.JSON(http.StatusOK, gin.H{
    		"code": 400,
    		"data": data,
    		"msg":  msg,
    	})
    }
    
    func UnprocessableEntity(context *gin.Context, data gin.H, msg string) {
    	context.JSON(http.StatusUnprocessableEntity, gin.H{
    		"code": 422,
    		"data": data,
    		"msg":  msg,
    	})
    }
    
    

    后续可以自己添加方法然后固定的格式

    第二种方式

    构建一个结构体 然后只有有些无用的值是可以不传的。
    这种方式对比上一种更加灵活多变。

    点击展开
    package api
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    	"reflect"
    )
    
    type ResponseJson struct {
    	Status int    `json:"-"`
    	Code   int    `json:"code,omitempty"`
    	Msg    string `json:"msg,omitempty"`
    	Data   any    `json:"data,omitempty"`
    }
    
    // IsEmpty 判断结构体是否为空
    func (r ResponseJson) IsEmpty() bool {
    	return reflect.DeepEqual(r, ResponseJson{})
    }
    
    // 构建状态码 ,如果 传入的ResponseJson没有Status 就使用默认的状态码
    func buildStatus(resp ResponseJson, defaultStatus int) int {
    	if resp.Status == 0 {
    		return defaultStatus
    	}
    	return resp.Status
    }
    
    func HttpResponse(ctx *gin.Context, status int, resp ResponseJson) {
    	if resp.IsEmpty() {
    		ctx.AbortWithStatus(status)
    		return
    	}
    	ctx.AbortWithStatusJSON(status, resp)
    }
    
    func Success(ctx *gin.Context, resp ResponseJson) {
    	HttpResponse(ctx, buildStatus(resp, http.StatusOK), resp)
    }
    
    func Fail(ctx *gin.Context, resp ResponseJson) {
    	HttpResponse(ctx, buildStatus(resp, http.StatusBadRequest), resp)
    }
    
    func ServerFail(ctx *gin.Context, resp ResponseJson) {
    	HttpResponse(ctx, buildStatus(resp, http.StatusInternalServerError), resp)
    
    }
    
    
  • 相关阅读:
    网络安全(黑客)——2024自学
    166 个最常用的 Linux 命令汇总,总有你需要用到的...
    微服务_Nacos
    Spring Boot(七)
    力扣刷题day46|1143最长公共子序列、1035不相交的线、53最大子序和
    R数据分析:扫盲贴,什么是多重插补
    ts中的泛型
    立方体IV(暑假每日一题 10)
    Uniapp自定义启动图在线生成storyboard(适用于Uniapp)
    c语言基础学习笔记(三):while循环
  • 原文地址:https://www.cnblogs.com/zichliang/p/16815360.html