Gin 框架输出封装

3,379 阅读1分钟

前言

Go 语言开发时,我们对外输出数据有以下几种

  • http 状态码
  • 接口状态码
  • 接口提示信息

如果按照常规的输出,我们不得不重复写大量无用的代码,特此将输出数据进行封装,提供默认参数,不传值,则输出默认数据,传值则输出传入的数据,直接上代码

入口文件

package main

import (
    "github.com/gin-gonic/gin"
    "yangyj/tools/response"
)

func main() {
    router := gin.Default()

	api := router.Group("/api")

	// v1 路由
	v1 := router.Group("/v1")
	{
		v1.GET("/test", func(context *gin.Context) {
			response.Success(context, response.R{
				P: response.P{
				    Message: "yangyj",
				    Params: gin.H{
				        "dataset": "yangyj",
                    },
                },
			})
		})

		v1.GET("/test2", func(context *gin.Context) {
			response.Fail(context, response.R{
				T: "XML",
				P: response.P{
					Message: "yangyj",
					Params: gin.H{
						"dataset": "yangyj",
					},
				},
			})
		})
	}

	_ = router.Run(":8000")
}

Response 封装文件

package response

import (
    "fmt"
    "github.com/gin-gonic/gin"
	"net/http"
)

// 输出数据结构体
type P struct {
    // HTTP 状态码 & 自定义状态码
	Code    int
	// 输出消息
	Message string
	// 输出自定义数据
	Params  gin.H
}

// Response 结构体
type R struct {
    // 输出类型,例如:JSON、XML、YAML
	T   string
	// 输出数据
    P P
}

func response(code int, message string, data gin.H) (int, gin.H) {
	response := gin.H{
		"code":    code,
		"message": message,
	}

	for index, value := range data {
		response[index] = value
	}

	return code, response
}

func success(params P) (int, gin.H) {
	code := http.StatusOK
	message := http.StatusText(code)
    data := params.Params

	fmt.Println(params)

	if params.Code != 0 {
	    code = params.Code
    }

    if params.Message != "" {
        message = params.Message
    }

	return response(code, message, data)
}

func fail(params P) (int, gin.H) {
	code := http.StatusInternalServerError
    message := http.StatusText(code)
    data := params.Params

    fmt.Println(params)

    if params.Code != 0 {
        code = params.Code
    }

    if params.Message != "" {
        message = params.Message
    }

    return response(code, message, data)
}

func write(context *gin.Context, contextType string, code int, res gin.H) {
	switch contextType {
	case "IndentedJSON":
		context.IndentedJSON(code, res)
	case "SecureJSON":
		context.SecureJSON(code, res)
	case "JSON":
		context.JSON(code, res)
	case "AsciiJSON":
		context.AsciiJSON(code, res)
	case "PureJSON":
		context.PureJSON(code, res)
	case "XML":
		context.XML(code, res)
	case "YAML":
		context.YAML(code, res)
	case "ProtoBuf":
		context.ProtoBuf(code, res)
	}
}

func Fail(context *gin.Context, response R) {
    // 默认输出 JSON 数据
    contextType := "JSON"
    if response.T != "" {
        contextType = response.T
    }
    // 构建输出数据
	code, res := fail(response.P)
    write(context, contextType, code, res)
}

func Success(context *gin.Context, response R) {
    // 默认输出 JSON 数据
    contextType := "JSON"
    if response.T != "" {
        contextType = response.T
    }
    // 构建输出数据
	code, res := success(response.P)
    write(context, contextType, code, res)
}

输出截图

/test2接口

/test接口