如何在swagger

时间:2017-03-05 09:16:30

标签: go swagger

通常由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)
  })
}

我宁愿更喜欢能够访问"处理程序"映射在生成的代码中,但无法访问。这样我就可以重新注册"一切都带有前缀。也许这是一个更好的解决方案?

1 个答案:

答案 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"))
}