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

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


它将帮助我在所有路由的公共位置添加跟踪和指标。


为了实现这一目标,我尝试了以下方法:


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

但是,为了制作通用包装器,我必须将响应主体作为接口。


请让我知道,我怎样才能实现它。


白衣染霜花
浏览 105回答 1
1回答

牛魔王的故事

要使其编译 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}现在只要你的返回对象实现了这个方法,就可以返回它。但是,函数签名必须包含这个新类型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go