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)
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需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