go-zero 统一返回

1、整体目录结构

1、全局处理主入口

Go 复制代码
package manage

import (
	"net/http"

	"github.com/zeromicro/go-zero/rest/httpx"
)

type Body struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Result  interface{} `json:"data"`
}

// 统一返回入口,
func ResponseHandler(w http.ResponseWriter, resp interface{}, err error) {
	if err != nil {
		// 如果err不为空的话,走错误处理函数,将err传递过去
		ErrHandler(err)
	} else {
		// 没有错误信息,返回相应内容
		httpx.OkJson(w, Body{
			Code:    OK.Code,
			Message: OK.Message,
			Result:  resp,
		})
	}
}

2、统一错误处理主入口

Go 复制代码
package manage

import (
	"net/http"
)

type CodeError struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

// 实现error的接口  然后CodeError继承一下Error方法  CodeError就为error类型的返回值
func (e *CodeError) Error() string {
	return e.Message
}

// 返回给前端的数据
func (e *CodeError) ErrorResponse() CodeError {
	return CodeError{
		Code:    e.Code,
		Message: e.Message,
	}
}

// 用来自定义抛出的异常,支持调用传递
func NewCodeError(code int, msg string) error {
	return &CodeError{
		Code:    code,
		Message: msg,
	}
}

// 提供new方法,任意地方传递参数返回CodeError类型的数据
func New(code int, msg string) CodeError {
	return CodeError{
		Code:    code,
		Message: msg,
	}
}

// 自定义错误返回函数 错误函数主入口
func ErrHandler(err error) (int, interface{}) {
	switch errorType := err.(type) {
	// 如果错误类型为CodeError,就返回错误类型的结构体
	case *CodeError:
		return http.StatusOK, errorType.ErrorResponse()
	default:
		// 系统错误,500 错误提示
		return http.StatusOK, CodeError{Code: 500, Message: err.Error()}
	}
}

3、全局异常状态

Go 复制代码
package manage

var (
	OK          = New(0, "操作成功")
	ReidsError  = New(6379, "redis连接失败")
	JwtError    = New(500, "JWT解密失败")
	TokenError  = New(401, "Token已过期")
	ServerError = New(500, "服务器内部错误")
)

4、非业务错误的再次封装,使用http.ResponseWriter进行返回给前端,常用在中间件中

Go 复制代码
package manage

import (
	"encoding/json"
	"net/http"
)

// codeError 接受统一返回格式,{code:int,message:string}
func SetWrite(w http.ResponseWriter, r *http.Request, codeError CodeError) {
	// 接口请求成功 200状态码
	w.WriteHeader(http.StatusOK)
	// 转换成json
	jsonData, _ := json.Marshal(codeError)
	// 设置相应格式
	w.Header().Set("Content-Type", "application/json")
	// 返回给前端结构体
	w.Write(jsonData)
}

5、修改路由Handler函数

Go 复制代码
func CreateMenuHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		var req systemMenuType.MenuCreateType
		if err := httpx.Parse(r, &req); err != nil {
			manage.ResponseHandler(w, nil, err)
			return
		}
		l := systemMenu.NewCreateMenuLogic(r.Context(), svcCtx)
		resp, err := l.CreateMenu(&req)
		if err != nil {
			manage.ResponseHandler(w, nil, err)
		} else {
			manage.ResponseHandler(w, resp, nil)
		}
	}
}

httpx.OkJsonCtx和httpx.ErrorCtx() 替换为 manage.ResponseHandler

搞定收工

相关推荐
ae_zr2 分钟前
QT动态编译应用后,如何快速获取依赖
开发语言·qt
gjxDaniel4 分钟前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
jiang_changsheng25 分钟前
环境管理工具全景图与深度对比
java·c语言·开发语言·c++·python·r语言
yong999035 分钟前
MATLAB面波频散曲线反演程序
开发语言·算法·matlab
LeoZY_39 分钟前
开源项目精选:Dear ImGui —— 轻量高效的 C++ 即时模式 GUI 框架
开发语言·c++·ui·开源·开源软件
Fightting8840 分钟前
Tkinter Button bind hover message
开发语言·python
qq_336313931 小时前
javaweb-web基础(springboot入门)
java·开发语言·mysql
计算机程序设计小李同学1 小时前
基于 Spring Boot + Vue 的龙虾专营店管理系统的设计与实现
java·spring boot·后端·spring·vue
玄同7651 小时前
LangChain 1.0 模型接口:多厂商集成与统一调用
开发语言·人工智能·python·langchain·知识图谱·rag·智能体
特立独行的猫a1 小时前
C++轻量级Web框架介绍与对比:Crow与httplib
开发语言·前端·c++·crow·httplib