Golang HTTP路由处理程序通用包装器实现

时间:2019-08-26 07:15:07

标签: go

我正在尝试转换一个返回响应正文和错​​误的路由处理程序,而不是直接将其写入响应编写器。 然后,我想从包装函数发送成功/错误响应。

这将帮助我在所有地方的同一位置添加跟踪和指标。

为此,我尝试了以下方法:

router.HandleFunc(app, "/login", WrapHandler(Login)).Methods("POST")
func WrapHandler(handler func(http.ResponseWriter, *http.Request) (interface{}, *types.HandlerErrorResponse)) func(http.ResponseWriter, *http.Request) {
    return func(w http.ResponseWriter, r *http.Request) {
        response, errResponse := handler(w, r)

        sendResponse(r.Context(), w, response, errResponse)
    }
}

登录是具有签名的界面:

Login(w http.ResponseWriter, r *http.Request) (*AuthenticationResponse, *types.HandlerErrorResponse)

现在,使用此代码,错误出现在编译中:

cannot use Login (type func(http.ResponseWriter, *http.Request) (*AuthenticationResponse, *types.HandlerErrorResponse)) as type func(http.ResponseWriter, *http.Request) (interface {}, *types.HandlerErrorResponse) in argument to WrapHandlerNew

但是,要制作通用包装器,我必须将响应正文作为接口。

请告诉我,我该如何实现。

1 个答案:

答案 0 :(得分:2)

使其编译 Login(w http.ResponseWriter, r *http.Request) (*AuthenticationResponse, *types.HandlerErrorResponse)必须为Login(w http.ResponseWriter, r *http.Request) (interface{}, *types.HandlerErrorResponse)

但是我建议您定义一个界面(或使用现有的界面:io.Reader可能就是您想要的)

定义您需要从响应访问的方法,然后将其返回。

type GenericBody interface{
    Bytes() []byte
}

现在,只要您的返回对象实现此方法,就可以返回它。但是,功能签名将必须包含此新类型。