通常由swagger设置简单服务器提供的示例,其中所有api调用json函数都在文档根目录上 . 例如着名的“你好世界”坐落在“/ hello” .
我想找到一种方法来定义给定的前缀,这样就可以将特定的api放在这个前缀下 . 如果前缀是“/api/2.0”,则示例api将成为
/hello --> /api/2.0/hello # The prefix would be "/api/2.0"
/goodbye --> /api/2.0/goodbye #
最后我想保持这种动态,并真正提供一些命令行开关
server -prefix '/api/2.0'
并且服务器将此用于api . 请注意,我还可以指定无前缀,系统应该回退到“/ hello”和“/ goodbye” .
是否可以通过swagger的实施来实现(https://github.com/go-swagger/go-swagger)
有人可以给我一个例子/或举一个简短的例子吗?
Addendum :我想基本上用swagger 2.0接口做这个 . 我现在知道它需要这样的东西:
http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))
基本上任务是让swagger生成的“finalHandler”保持不变(因此它认为仍然处理“only”/ hello或/ goodbye) . 但是中间件会在finalHandler之前捕获所有流量 . “/api/2.0”将被删除/转换(这是我正在搜索的,如何???),并且中间件会将此传递给最终处理程序,后者仍然认为它服务/你好 . 我不确定它运行“/api/2.0”的信息是否是必需的,但是mabybe应该作为上下文添加 .
见https://github.com/go-swagger/go-swagger/blob/master/docs/use/middleware.md
古怪的解决方案,似乎工作 .
func setupGlobalMiddleware(handler http.Handler) http.Handler {
prefix:="/api/2.0"
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if strings.HasPrefix(r.URL.Path, prefix) {
r.URL.Path = r.URL.Path[len(prefix):]
}
handler.ServeHTTP(w, r)
})
}
我宁愿更喜欢是否可以访问生成的代码中的“处理程序”映射,但它无法访问 . 这样我就可以用前缀“重新注册”所有内容 . 也许这是一个更好的解决方案?
1 回答
简单的示例代码 . 请享用 .