• 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)
    
    }
    
    
  • 相关阅读:
    Python基本数据类型与常用库
    CloudCompare 技巧四 点云匹配
    程序设计一_实训8_函数参数训练
    《深入理解计算机系统》:Cache Lab
    如何开发一个 Safari 插件
    力扣 857. 雇佣 K 名工人的最低成本
    Quarto 入门教程 (2):如何使用并编译出不同文档
    全球名校AI课程库(30)| MIT麻省理工 · 深度学习与无人驾驶课程『Deep Learning for Self-Driving Cars』
    C++基础——数组
    吃透Java线程安全问题
  • 原文地址:https://www.cnblogs.com/zichliang/p/16815360.html