为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白衣染霜花 2023-07-17 14:47:00
我正在尝试转换返回响应正文和错误的路由处理程序,而不是直接将其写入响应编写器。然后我想从包装函数发送成功/错误响应。它将帮助我在所有路由的公共位置添加跟踪和指标。为了实现这一目标,我尝试了以下方法: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 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

要使其编译 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

}

现在只要你的返回对象实现了这个方法,就可以返回它。但是,函数签名必须包含这个新类型。


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信