Kratos业务状态码和HTTP状态码分离

起因 在我们使用 kratos 开发 web 应用时,由于 kratos 默认设计导致我们在自定义错误时,访问 api 时,相应的状态码是以自定义的 error code 作为 http status code 表现的。 如果我们想将 业务状态码和 HTTP 状态码分离,即所有的 http status code 都为 200, 实际的业务状态码以在 response 中响应的 code 为主。 我们该如何实现呢? 有2种方法,一种是自定义中间件将错误进行特别处理,另一种是自定义 Encoder。 本篇文章主要就是介绍 Encoder 方法。 自定义 Encoder 根据我们的需要,我们需要自定义 2 个 Encoder, ErrorEncoder 和 ResponseEncoder 函数。 需要的参数类型分别如下: // ResponseEncoder with response encoder. func ResponseEncoder(en EncodeResponseFunc) ServerOption { return func(o *Server) { o.enc = en } } // ErrorEncoder with error encoder. func ErrorEncoder(en EncodeErrorFunc) ServerOption { return func(o *Server) { o.ene = en } } // EncodeResponseFunc is encode response func. type EncodeResponseFunc func(http.ResponseWriter, *http.Request, interface{}) error // EncodeErrorFunc is encode error func. type EncodeErrorFunc func(http.ResponseWriter, *http.Request, error) 1 自定义 Response 结构 定义一个 Response 的结构体 ...

三月 27, 2022 · overstarry