登录
首页 >  Golang >  Go问答

如何从 Gin 中除一个路由之外的所有路由提供静态文件?

来源:stackoverflow

时间:2024-04-18 20:06:35 330浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《如何从 Gin 中除一个路由之外的所有路由提供静态文件?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

正如标题所说,考虑一个 gin 路由器,我想在其中提供来自所有路由的静态文件除了一个。假设这一路由是 /api。第一次尝试可能如下所示:

package main

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

func main() {
    r := gin.default()

    r.staticfs("/", gin.dir("static", false))
    r.get("/api/v1/foo", func(c *gin.context) { c.json(200, gin.h{"foo": true}) })

    r.run(":9955")
}

底层的 routergroup.staticfs (以及 static )使用通配符路径参数连接相对路径:path.join(relativepath, "/*filepath")。当 relativepath 是根路径 / 时,它会出现恐慌:

恐慌:新路径“/api/v1/foo”中的“/api/v1/foo”与现有前缀“/*filepath”中的现有通配符“/*filepath”冲突

这是由于 gin 的 http 路由器实现:路由匹配路径前缀,因此根上的通配符将与所有其他路由冲突。有关此行为的更多详细信息可以在此处找到 - 这是提出此问题的地方。

另一种可能的解决方案是为静态文件路由添加前缀,这样就不会与 /api 冲突:

r.StaticFS("/static", gin.Dir("static", false))

但这也不允许我从根目录提供资产。如何在 root 上使用通配符或等效项并仍然在一个特定路径上匹配?


正确答案


有一个名为 static 的包用于此目的。

https://github.com/gin-contrib/static#canonical-example

只需将示例修改如下

package main

import (
  "github.com/gin-contrib/static"
  "github.com/gin-gonic/gin"
)

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

  // server a directory called static
  r.Use(static.Serve("/", static.LocalFile("static", false)))
  
  // And any route as usual   
  r.GET("/api/ping", func(c *gin.Context) {
    c.String(200, "ping")
  })

  r.Run(":9955")
}

到这里,我们也就讲完了《如何从 Gin 中除一个路由之外的所有路由提供静态文件?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>