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)
。