一,演示项目的相关信息:
1,地址:
GitHub - liuhongdi/digv15: gin框架统一定义 API 错误码
2,功能:演示了统一定义api返回结果中的错误代码
3,项目结构:如图:
说明:刘宏缔的go森林是一个专注golang的博客,
网站:https://blog.imgtouch.com
原文: go语言web开发系列之十五:gin框架统一定义API错误码 – 架构森林
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,go代码说明:
1,pkg/result/result.go
package result
import (
"github.com/gin-gonic/gin"
"net/http"
)
//返回的结果的内容:
type ResultCont struct {
Code int `json:"code"` //提示代码
Msg string `json:"msg"` //提示信息
Data interface{} `json:"data"` //出错
}
//放回结果
type Result struct {
Ctx *gin.Context
}
//生成result
func NewResult(ctx *gin.Context) *Result {
return &Result{Ctx: ctx}
}
//生成一个error
func NewError(code int, msg string) ResultCont {
return ResultCont{
Code: code,
Msg: msg,
Data: gin.H{},
}
}
//成功
func (r *Result) Success(data interface{}) {
if (data == nil) {
data = gin.H{}
}
res := ResultCont{}
res.Code = 0
res.Msg = ""
res.Data = data
r.Ctx.JSON(http.StatusOK,res)
}
//出错,接受code和msg
func (r *Result)ErrorCode(code int,msg string) {
res := ResultCont{}
res.Code = code
res.Msg = msg
res.Data = gin.H{}
//if (code == http.StatusBadRequest)
r.Ctx.JSON(http.StatusOK,res)
r.Ctx.Abort()
}
//出错,接受resultcont
func (r *Result)Error(res ResultCont) {
r.Ctx.JSON(http.StatusOK,res)
r.Ctx.Abort()
}
2,global/errorConstant.go
package global
import (
"github.com/liuhongdi/digv15/pkg/result"
)
var (
// OK
OK = result.NewError(0, "OK")
//参数模块
ErrParam = result.NewError(400, "参数不合法")
//文章模块报错
ErrArticleNot = result.NewError(10001, "文章不存在")
ErrArticleS = result.NewError(10002, "文章查询出错")
//用户模块
ErrUserNot = result.NewError(20001, "用户不存在")
// ...
)
3,controller/articleController.go
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/liuhongdi/digv15/global"
"github.com/liuhongdi/digv15/pkg/page"
"github.com/liuhongdi/digv15/pkg/result"
"github.com/liuhongdi/digv15/pkg/validCheck"
"github.com/liuhongdi/digv15/request"
"github.com/liuhongdi/digv15/service"
)
type ArticleController struct{}
func NewArticleController() ArticleController {
return ArticleController{}
}
//得到一篇文章的详情
func (a *ArticleController) GetOne(c *gin.Context) {
resultRes := result.NewResult(c)
param := request.ArticleRequest{ID: validCheck.StrTo(c.Param("id")).MustUInt64()}
valid, _ := validCheck.BindAndValid(c, ¶m)
if !valid {
//result.ErrorCode(global.ErrParam.Code,global.ErrParam.Msg+":"+errs.Error())
resultRes.Error(global.ErrParam)
return
}
articleOne,err := service.GetOneArticle(param.ID);
if err != nil {
//result.Error(404,"数据查询错误")
//result.ErrorCode(global.ErrArticleNot.Code,global.ErrArticleNot.Msg)
resultRes.Error(global.ErrArticleNot)
} else {
resultRes.Success(&articleOne);
}
return
}
//得到多篇文章,按分页返回
func (a *ArticleController) GetList(c *gin.Context) {
resultRes := result.NewResult(c)
pageInt := 0
//is exist?
curPage := c.Query("page")
//if curPage not exist
if (len(curPage) == 0) {
pageInt = 1
} else {
param := request.ArticleListRequest{Page: validCheck.StrTo(c.Param("page")).MustInt()}
valid, _ := validCheck.BindAndValid(c, ¶m)
if !valid {
//result.Error(400,errs.Error())
resultRes.Error(global.ErrParam)
return
}
pageInt = param.Page
}
pageSize := 2;
pageOffset := (pageInt-1) * pageSize
articles,err := service.GetArticleList(pageOffset,pageSize)
if err != nil {
//result.ErrorCode(global.ErrArticleS.Code,"数据查询错误");
resultRes.Error(global.ErrArticleS);
fmt.Println(err.Error())
} else {
//sum,_ := dao.SelectcountAll()
sum,_ := service.GetArticleSum()
pageInfo,_ := page.GetPageInfo(pageInt,pageSize,sum)
resultRes.Success(gin.H{"list":&articles,"pageinfo":pageInfo});
}
return
}
说明:演示了对错误码的使用,
可以见到:EorrCode方法的使用不如Error直接调用定义的错误码更方便
4,其他相关代码可访问github
三,测试效果:
1,正常访问:
http://127.0.0.1:8000/article/getone/2
返回:
2,访问不存在的文章id:
http://127.0.0.1:8000/article/getone/200
返回:
可以看到返回的是我们在errorConstant文件中定义的错误code和msg
四,查看用到的库的版本
module github.com/liuhongdi/digv15
go 1.15
require (
github.com/gin-gonic/gin v1.6.3
github.com/go-playground/universal-translator v0.17.0
github.com/go-playground/validator/v10 v10.2.0
github.com/jinzhu/gorm v1.9.16
github.com/magiconair/properties v1.8.4 // indirect
github.com/mitchellh/mapstructure v1.3.3 // indirect
github.com/pelletier/go-toml v1.8.1 // indirect
github.com/spf13/afero v1.4.1 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.7.1
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect
golang.org/x/text v0.3.4 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect
)