将 swaggo/http-swagger 与 julienschmidt/httprouter 一起使用时出现空白页面

Fra*_*and 2 go swagger

我正在制作一个 api 并使用 swaggo/swag 构建一个 swagger 界面。以前,我使用 net/http 包,一切正常。

我切换到 julienschmidt/httprouter,但我无法使 swagger 界面再次工作。这是我的代码

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/julienschmidt/httprouter"
    httpSwagger "github.com/swaggo/http-swagger"
)

func main() {
    router := httprouter.New()

    router.ServeFiles("/api/doc/static/*filepath", http.Dir("api/swagger/static"))
    router.HandlerFunc(http.MethodGet, "/api/doc/index.html", swaggerHandler)
    // router.HandlerFunc(http.MethodGet, "/api/doc", swaggerHandler)

    fmt.Println("Server on port 8080")
    log.Fatal(http.ListenAndServe(":8080", router))
}

func swaggerHandler(w http.ResponseWriter, r *http.Request) {
    swaggerFileUrl := "http://localhost:8080/api/doc/static/swagger.json"
    handler := httpSwagger.Handler(httpSwagger.URL(swaggerFileUrl))
    handler.ServeHTTP(w, r)
}
Run Code Online (Sandbox Code Playgroud)

我检查了swaggerFileUrl变量是否正确,并且我可以使用此 url 访问 json 文件。该界面是一个完整的空白页面,标题为“Swagger UI”。因为标题已被替换,所以我假设发生了一些事情,但我不知道问题是来自 httpSwagger 还是 httprouter。

编辑:问题是由于加载界面的 javascript 文件不存在而引起的。请参阅这个github 问题

小智 5

你可以这样做:

routes := httprouter.New()

routes.GET("/doc/:any", swaggerHandler)


func swaggerHandler(res http.ResponseWriter, req *http.Request, p httprouter.Params) {
     httpSwagger.WrapHandler(res, req)
}
Run Code Online (Sandbox Code Playgroud)

不要忘记导入 doc 文件

import (
     _ "example.project/docs"
)
Run Code Online (Sandbox Code Playgroud)