Gin: 封装一个便捷调用的JSON响应函数

省去写一堆重复代码,可以一直添加自定义消息。

进阶版

支持复杂操作

package util

import "github.com/gin-gonic/gin"

// 响应码与消息映射关系
var customRespone = map[int]string{
	200:  "操作成功",
	400:  "你那边出错了",
	401:  "没有权限",
	403:  "禁止访问",
	404:  "你跑丢了",
	500:  "服务器炸了",
	601:  "重新登陆吧~",
	5001: "缓存键不存在",
}

// 便捷json响应工具封装
// 自定义消息为可选参数,如果未提供,则使用映射中的默认消息
// 如果提供了自定义消息,则使用自定义消息
// 只在非200响应时调用Abort
func Rsp(c *gin.Context, code int, customMsg ...string) {
	msg := customRespone[code]
	if len(customMsg) > 0 {
		msg = customMsg[0]
	}
	c.JSON(200, gin.H{
		"code":    code,
		"message": msg,
	})
	if code != 200 {
		c.Abort()
	}
}

// 调用示例
// util.Rsp(c, 401)
// 自定义消息
// util.Rsp(c, 401, "自定义消息")
// util.Rsp(c, 500, fmt.Sprintf("清除缓存键[%s]失败", key))

简易版

package util

import "github.com/gin-gonic/gin"

// 响应码与消息映射
var customRespone = map[int]string{
	200: "请求成功",
	400: "错误请求",
	401: "未授权",
	403: "禁止访问",
	404: "你跑丢了",
	500: "服务器内部错误",
}

// 便捷json响应函数
func Rsp(c *gin.Context, code int) {
	msg := customRespone[code]
	c.JSON(code, gin.H{
		"code":    code,
		"message": msg,
	})
	c.Abort()
}

// 调用示例
// util.Rsp(c, 401)

注意:有一个坑

c.JSON()中的第一个数值必须是标准的HTTP状态码,也就是1-599,超出会导致panic。

这里有2种解决方案:

  1. 真实响应码始终返回200,将自定义响应码放入响应体,互不干扰,缺点是前端无法直接判断响应头而需要解析响应内容。
  2. 接收两个参数,第一个参数作为真实响应头状态码,第二个参数作为消息的映射或是直接显示的消息(使用.(type)判断格式),这里放个示例👇
func Rsp[T int | string](c *gin.Context, statusCode int, msg T) {
	var msgStr string
	switch v := any(msg).(type) {
	case int:
		msgStr = codeMap[v]
	case string:
		msgStr = v
	}
	c.JSON(statusCode, gin.H{
		"code":    statusCode,
		"message": msgStr,
	})
	if statusCode != 200 {
		c.Abort()
	}
}
暂无评论

发送评论 编辑评论


				
上一篇
下一篇