我正在尝试转换一个返回响应正文和错误的路由处理程序,而不是直接将其写入响应编写器。 然后,我想从包装函数发送成功/错误响应。
这将帮助我在所有地方的同一位置添加跟踪和指标。
为此,我尝试了以下方法:
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
但是,要制作通用包装器,我必须将响应正文作为接口。
请告诉我,我该如何实现。
答案 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
}
现在,只要您的返回对象实现此方法,就可以返回它。但是,功能签名将必须包含此新类型。