gin 统一响应结果


使用 gin

使用 gin 框架,编写 api 接口时,需要定义返回格式

package main

import (
	"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 result

import (
	"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 main

import (
	"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 result

var (
	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)
})

Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC