通常由swagger设置简单服务器提供的示例,其中所有api调用json函数都在文档根目录上。 例如着名的"你好世界"坐在" /你好"
我想找到一种定义给定前缀的方法,这样就可以将特定的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"和" /再见"。
这可以通过swagger(https://github.com/go-swagger/go-swagger)
的go-lang实现来实现有人可以给我一个例子/或举一个简短的例子吗?
附录: 我想基本上用swagger 2.0接口做这个。 我现在知道它需要这样的东西:
http.Handle("/", middlewareOne(middlewareTwo(finalHandler)))
基本上任务是留下生成的招摇" finalHandler"未被触及(因此它认为仍处理"仅#34; /你好,或/再见)。但是中间件会在finalHandler之前捕获所有流量。 " /api/2.0"将被删除/转换(这是我正在搜索,如何???)和中间件将传递给finalhandler,仍然相信它服务/你好。我不确定它运行的信息" /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)
})
}
我宁愿更喜欢能够访问"处理程序"映射在生成的代码中,但无法访问。这样我就可以重新注册"一切都带有前缀。也许这是一个更好的解决方案?
答案 0 :(得分:0)
简单的示例代码。请享用。
package main
import (
"github.com/julienschmidt/httprouter"
"net/http"
"log"
)
type (
API interface {
Hello(w http.ResponseWriter, r *http.Request)
Goodbye(w http.ResponseWriter, r *http.Request)
}
API2 struct {}
API3 struct {}
)
func main() {
mux := httprouter.New()
mux.GET("/api/:version/:command",API_HANDLER)
log.Fatal(http.ListenAndServe(":8091", mux))
}
//---------------------------------------------------------------------------
// HANDLERS
//---------------------------------------------------------------------------
func API_HANDLER(w http.ResponseWriter, r *http.Request, p httprouter.Params){
var hand API
switch p.ByName("version") {
case "2.0": hand = API2{}
case "3.0": hand = API3{}
default: hand = nil
}
switch p.ByName("command") {
case "hello": hand.Hello(w,r)
case "goodbye": hand.Goodbye(w,r)
}
}
//---------------------------------------------------------------------------
// API2 version
//---------------------------------------------------------------------------
func (a API2) Hello(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("[API2] Hello"))
}
func (a API2) Goodbye (w http.ResponseWriter, r *http.Request) {
w.Write([]byte("[API2] Goodbye"))
}
//---------------------------------------------------------------------------
// API3 version
//---------------------------------------------------------------------------
func (a API3) Hello(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("[API3] Hello"))
}
func (a API3) Goodbye (w http.ResponseWriter, r *http.Request) {
w.Write([]byte("[API3] Goodbye"))
}