json 如何在Gin路由器中渲染静态文件?

nwlls2ji  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(137)

我想用gin服务器提供一个JSON文件,并在HTML文件中设置一些自定义的值,在其中使用JavaScript调用JSON文件。
我的申请结构:

.
├── main.go
└── templates
    ├── index.html
    └── web.json

我把这些基本源代码放入main.go文件中:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

var router *gin.Engine

func main() {
    router = gin.Default()
    router.LoadHTMLGlob("templates/*")

    router.GET("/web", func(c *gin.Context) {
        c.HTML(
            http.StatusOK,
            "index.html",
            gin.H{
                "title": "Web",
                "url":   "./web.json",
            },
        )
    })

    router.Run()
}

templates/index.html文件中的一些代码:

<!doctype html>
<html>

  <head>
    <title>{{ .title }}</title>

    // ...
  </head>

  <body>
    <div id="swagger-ui"></div>

    // ...
    
    <script>
      window.onload = function() {
        // Begin Swagger UI call region
        const ui = SwaggerUIBundle({
          url: "{{ .url }}",
          dom_id: '#swagger-ui',
          // ...
        })
        // End Swagger UI call region

        window.ui = ui
      }
    </script>

  </body>
</html>

运行应用程序时,我得到了一个获取错误:
页面没有找到。
那么,我应该如何在Gin内部服务器中提供要访问的web.json文件呢?

nue99wik

nue99wik1#

引用原始杜松子酒文件:https://github.com/gin-gonic/gin#serving-static-files

func main() {
    router := gin.Default()
    router.Static("/assets", "./assets")
    router.StaticFS("/more_static", http.Dir("my_file_system"))
    router.StaticFile("/favicon.ico", "./resources/favicon.ico")

    // Listen and serve on 0.0.0.0:8080
    router.Run(":8080")
}

因此,基本上,您应该在已定义的其他路由旁边定义一个特定于JSON文件的路由,然后使用该路由。

e4eetjau

e4eetjau2#

如果你想根据查询路径提供静态文件,你可以这样做:

func serve() {
    r := gin.Default()

    r.GET("/*path", func(c *gin.Context) {
        // read from file
        data, err := os.ReadFile("/path/to/file")
        if err != nil {
            // error handler
        }
        switch c.Request.URL.Path {
        case ".html":
            c.Header("Content-Type", "text/html")
        case ".css":
            c.Header("Content-Type", "text/css")
        case ".js":
            c.Header("Content-Type", "application/javascript")
            // ...
        }
        _, _ = c.Writer.Write(data)
    })
    // Listen and serve on 0.0.0.0:8080
    panic(r.Run(":8080"))
}

相关问题