goframe API 自定义接口返回值处理

前言

goframe 默认使用了中间键 ghttp.MiddlewareHandlerResponse, HTTP Server 的数据返回通过 ghttp.Response 对象实现,ghttp.Response 对象实现了标准库的 http.ResponseWriter 接口。数据输出使用 Write* 相关方法实现,并且数据输出采用了 Buffer 机制,因此数据的处理效率比较高。

如果这时候我们想修改它的默认统一返回值处理,可以根据业务需要重写中间键,以下是在 ghttp.MiddlewareHandlerResponse 的基础上修改。

更改默认Middleware

goframe 默认使用了中间键 ghttp.MiddlewareHandlerResponse, 我们可以把这个中间键复制一份,重新建立一个中间键:

复制代码
// DefaultHandlerResponse is the default implementation of HandlerResponse.
type DefaultHandlerResponse struct {
	Code    int         `json:"code"    dc:"Error code"`
	Message string      `json:"msg" dc:"Error message"`
	Data    interface{} `json:"data"    dc:"Result data for certain request according API definition"`
}

func MiddlewareResponseHandler(r *ghttp.Request) {
	r.Middleware.Next()

	if r.Response.BufferLength() > 0 {
		return
	}

	var (
		msg  string
		err  = r.GetError()
		res  = r.GetHandlerResponse()
		code = gerror.Code(err)
	)
	if err != nil {
		if code == gcode.CodeNil {
			code = gcode.CodeInternalError
		}
		msg = err.Error()
	} else {
		if r.Response.Status > 0 && r.Response.Status != http.StatusOK {
			msg = http.StatusText(r.Response.Status)
			switch r.Response.Status {
			case http.StatusNotFound:
				code = gcode.CodeNotFound
			case http.StatusForbidden:
				code = gcode.CodeNotAuthorized
			default:
				code = gcode.CodeUnknown
			}
			// It creates error as it can be retrieved by other middlewares.
			err = gerror.NewCode(code, msg)
			r.SetError(err)
		} else {
			code = gcode.CodeOK
		}
	}
	r.Response.WriteJson(DefaultHandlerResponse{
		Code:    code.Code(),
		Message: msg,
		Data:    res,
	})
}

这里的中间键,我只修改了默认返回的 DefaultHandlerResponse,达到了自定义返回值处理的目的。

修改项目中 internal/cmd/cmd.go中,group.Middleware(ghttp.MiddlewareHandlerResponse),改为自己的中间键 group.Middleware( MiddlewareResponseHandler)

posted @   牛奔  阅读(803)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
历史上的今天:
2021-05-22 Golang 入门 : 浮点数
2021-05-22 Golang 入门 : 整型
2021-05-22 Golang 入门 : 类型系统介绍
2020-05-22 linux安装nodejs
2020-05-22 mysql导入失败
2020-05-22 解决ERROR 1231 (42000): Variable 'time_zone' can't
点击右上角即可分享
微信分享提示