首页 文章

如何在swagger中创建前缀路由

提问于
浏览
0

通常由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 回答

  • 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"))
    }
    

相关问题