web项目中规范的写法会使用controller层作为控制器,通常有大量json返回的需求,工作中对success、fail、abort分别进行了封装,以下是具体代码,可以根据实际需求进行修改。
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
jsonIter "github.com/json-iterator/go"
)
type response struct {
Code int `json:"code"`
Data interface{} `json:"data"`
Msg string `json:"msg"`
}
func SuccessJson(c *gin.Context, data interface{}) {
JsonResponse(c, "操作成功", 200, data)
}
func JsonResponse(c *gin.Context, msg string, code int, data interface{}) {
responseData := response{
Code: code,
Data: data,
Msg: msg,
}
value, err := jsonIter.Marshal(responseData)
if err != nil {
return
}
c.Writer.Header().Set("Content-Type", "application/json")
_, err = c.Writer.WriteString(string(value))
if err != nil {
fmt.Printf("写入JSON响应失败:%v:::%s\n", err, err.Error())
_ = c.Error(err)
}
c.Abort()
}
func FailJson(c *gin.Context, msg string) {
if msg == "" {
msg = "操作失败"
}
JsonResponse(c, msg, 503, nil)
}
type BaseController struct {
}
// SuccessJson 成功响应
func (r *BaseController) SuccessJson(c *gin.Context, data interface{}) {
SuccessJson(c, data)
}
// Abort 中断响应
func (r *BaseController) Abort(c *gin.Context, code int) {
c.AbortWithStatus(code)
}
// FailJson 失败响应
func (r *BaseController) FailJson(c *gin.Context, msg string) {
FailJson(c, msg)
}
使用示例
type InfoController struct {
BaseController //这里继承
}
func NewInfoController() *InfoController {
return &InfoController{}
}
func (r *InfoController) GetSkin(c *gin.Context) {
installedInfo, err := pkgInstances.NewInstalledJsonS()
if err != nil {
return
}
r.SuccessJson(c, installedInfo.SkinItems)
}