省去写一堆重复代码,可以一直添加自定义消息。
进阶版
支持复杂操作
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种解决方案:
- 真实响应码始终返回200,将自定义响应码放入响应体,互不干扰,缺点是前端无法直接判断响应头而需要解析响应内容。
- 接收两个参数,第一个参数作为真实响应头状态码,第二个参数作为消息的映射或是直接显示的消息(使用.(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()
}
}