如何在Cloud函数中提供类似swagger ui的静态文件



如何使用Go在Cloud Function中提供swagger ui dist?

云外功能环境我会做:

package main
import (
"fmt"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("./swagger-ui-dist"))
http.Handle("/swaggerui/", http.StripPrefix("/swaggerui/", fs))
http.ListenAndServe(":8080", nil)
}

但由于Cloud函数使用一个普通函数作为使用标准http的处理程序。HanlderFunc接口我不知道如何让它工作。

我试着模拟这个场景,用http进行测试。ServeFile,但不起作用。似乎没有下载文件夹的所有内容。

package main
import (
"fmt"
"net/http"
)
func cloudFunctionHandler(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./swagger-ui-dist")
}
func main() {
http.HanldeFunc("/swaggerui/", handler)
http.ListenAndServe(":8080", nil)
}

我尝试了几种方法,它在本地以与Cloud Function相同的行为工作(相同的函数签名(,但在Cloud Function上部署后就不起作用了。

我明白为什么。事实上,Buildpack(谷歌开发的用于构建没有Dockerfile的容器的工具,现在位于CNCF沙盒中(编译.go文件并将二进制文件复制到最终的容器层。省略了所有其他文件/目录。因此,它不起作用!

我建议您使用Cloud Run(与Cloud Functions相同的底层平台,在某些情况下更便宜。我写了一篇关于这方面的文章(

另一种解决方案是使用未编译的语言,如NodeJS或Python。

实际上有三种可能(我知道(:

  1. 从CDN提供静态文件。例如,来自http://cdnjs.cloudflare.com/ajax/libs/swagger-ui/3.40.0/
  2. 将静态文件自己托管在另一个端点上
  3. 将静态文件添加到云函数的根文件夹中。这些将与您的代码打包在一起,因此在部署时可用

(我选择了选项3(

对于选项2和3,必须覆盖swaggerui用于其静态资源的文件夹。如何做到这一点取决于如何配置swagger ui。

在我的案例中,我使用flask_restx Python包来生成swagger.json并提供swaggerui。所以我像这样打了猴痘:

from flask_restx.apidoc import apidoc
apidoc.static_folder = '<MY STATIC FOLDER PATH' # e.g. os.path.abspath('static/swaggerui')

此外,在运行gcloud function deploy ...之前,您需要将文件从swaggerui库复制到函数的根目录。

在CI管道期间,我将static文件夹从flask_restx复制到函数的根目录。

希望这能帮助到任何人!

相关内容

  • 没有找到相关文章

最新更新