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)

猜你喜欢

转载自blog.csdn.net/Guzarish/article/details/130818705
今日推荐