使用 gin 框架,编写 api 接口时,需要定义返回格式
package mainimport ("net/http""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code": 200,"msg": "success","data": nil,})})// 监听端口,启动服务r.Run(":8080")}
这种方法有一个弊端,每次返回都需要写这个结构
c.JSON(http.StatusOK, gin.H{"code": 200,"msg": "success","data": nil,})
package resultimport ("net/http""github.com/gin-gonic/gin"
)type Response struct {Code int `json:"code"`Msg string `json:"msg"`Data interface{} `json:"data"`
}func Result(c *gin.Context, code int, msg string, data interface{}) {c.JSON(http.StatusOK, Response{code,msg,data,})
}
func Error(code int, msg string) Response {return Response{code,msg,nil,}
}func Ok(c *gin.Context) {OkWithData(c, nil)
}func OkWithData(c *gin.Context, data interface{}) {Result(c, SUCCESS.Code, SUCCESS.Msg, data)
}func OkWithMsg(c *gin.Context, msg string) {Result(c, SUCCESS.Code, msg, nil)
}func Fail(c *gin.Context, err Response) {Result(c, err.Code, err.Msg, nil)
}func FailWithMsg(c *gin.Context, err Response, msg string) {Result(c, err.Code, msg, nil)
}
package mainimport ("gin-demo/result""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {result.Ok(c)})r.GET("/hello", func(c *gin.Context) {result.OkWithData(c, "hello world")})// 监听端口,启动服务r.Run(":8080")}
这样在每个 HandlerFunc 方法中只需要使用 result 包下面的方法即可,统一管理,还可以定义统一的错误码
package resultvar (OK = Error(200, "success")NeedRedirect = Error(301, "need redirect")InvalidArgs = Error(400, "invalid params")Unauthorized = Error(401, "unauthorized")Forbidden = Error(403, "forbidden")NotFound = Error(404, "not found")Conflict = Error(409, "entry exist")TooManyRequests = Error(429, "too many requests")ResultError = Error(500, "response error")DatabaseError = Error(598, "database error")CSRFDetected = Error(599, "csrf attack detected")UserError = Error(5001, "username or password error")CodeExpire = Error(5002, "verification expire")CodeError = Error(5003, "verification error")UserExist = Error(5004, "user Exist")
)
r.GET("/hello", func(c *gin.Context) {result.Fail(c, result.ResultError)
})
下一篇:【夜读】一个人越活越好的5个习惯