go语言web开发系列之十五:gin框架统一定义API错误码

一,演示项目的相关信息:

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, &param)
	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, &param)
		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
)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘你真牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值