go-gin web框架下HTTP返回数据格式统一封装
http的返回固定的json格式数据
·
格式封装
场景:希望http的返回内容格式固定,包含自定义的多个字段,json格式。查询等得到的数据全部挂在“data”这个key底下。格式形如:
{
"code": code,
"msg": msg,
"count": count,
"data": data
}
package util
import (
"net/http"
"github.com/gin-gonic/gin"
)
// code 自己定义的状态码
// msg 返回的信息
// count 返回的内容的长度/数量
// data 返回的内容
func Response(context *gin.Context, httpStatus int, code int, msg string, count int, data interface{}) {
context.JSON(httpStatus, gin.H{
"code": code,
"msg": msg,
"count": count,
"data": data,
})
}
func ResponseOK(context *gin.Context, count int, data interface{}) {
context.JSON(http.StatusOK, gin.H{
"code": "0",
"msg": "Success",
"count": count,
"data": data,
})
}
// todo 其它函数按需扩展
// todo 可对code做枚举
// todo 可对msg做枚举和翻译
注意:
这里data的数据类型是空接口,网上很多文档中写的是gin.H,但是调用会报错。
于是查了一下gin.H的含义:
gin.H实际上就是map[string]interface{},
而interface{} 可以代表任意类型,
interface{} 就是一个空接口,所有类型都实现了这个接口,所以它可以代表所有类型,
所以我们可以用map的形式插入任意类型数据,
那么,既然传入的data是不确定的类型,那么我们这里使用空接口类型即可。
controller层
在controller层,即可使用该格式封装函数
package controller
import (
"myprojectname/dao"
"myprojectname/util"
"github.com/gin-gonic/gin"
)
type UserController struct {
}
func (u UserController) UserQueryAll(c *gin.Context) {
userdao := dao.UserDAO{}
users := userdao.UserQueryAll()
// 原来的调用方式
// c.JSON(http.StatusOK, gin.H{
// "data": users,
// })
util.ResponseOK(c, len(users), users)
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)