如何在go-swagger中将namespace参数传入自定义Handler函数?
问题:如何将namespace字符串传递给go-swagger对应的Handler函数?
我正在使用go-swagger,定义了如下API接口:
/somethings: get: produces: - text/plain tags: - somethings summary: some summary operationId: GetSomethings responses: "200": description: some summary schema: type: string
为此编写了对应的Handler函数:
package impl func GetSomethingsHandlerFunc(params metrics.GetSomethingsParams, namespace string) middleware.Responder { return middleware.ResponderFunc.... }
其中自动生成的GetSomethingsParams结构体如下:
type GetMetricsParams struct { // HTTP Request Object HTTPRequest *http.Request `json:"-"` }
在configureAPI函数中尝试这样设置,但无法正确传递namespace:
api.SomethingsGetHandler = somethings.GetSomethingsHandlerFunc(impl.GetSomethingsHandlerFunc, "some_namespace_value")
请问如何将namespace字符串(即"some_namespace_value")正确传递给impl.GetSomethingsHandlerFunc?
解决方案
go-swagger生成的GetSomethingsHandlerFunc适配器要求传入的函数必须符合**func(metrics.GetSomethingsParams) middleware.Responder**的签名,而你的impl.GetSomethingsHandlerFunc多了一个namespace参数,直接传递会出现签名不匹配的问题。
解决方法是使用闭包捕获namespace变量,将你的Handler函数转换成符合要求的签名:
api.SomethingsGetHandler = somethings.GetSomethingsHandlerFunc(func(params metrics.GetSomethingsParams) middleware.Responder { // 闭包捕获外部的namespace参数,传递给目标Handler return impl.GetSomethingsHandlerFunc(params, "some_namespace_value") })
这样每次请求触发Handler时,闭包会自动将预先设置的namespace值传入你的impl.GetSomethingsHandlerFunc,既满足go-swagger的签名要求,又实现了参数传递。
内容的提问来源于stack exchange,提问作者Ugla BUla
相关产品推荐
相关产品推荐

