当前位置: 首页 > article >正文

GO 的 Web 开发系列(四)—— 静态资源文件访问的几种方式

Gin 的路由其实就是 Java 中 @RequestMapping 注解的内容,只是 Go 需要在一个代码模块中统一对所有路由进行配置。

全文链接:https://blog.nineya.com/archives/155.html

一、路由组配置

一般情况下,通过路由需要完成两个事情,一是通过 HTML 模板完成前端页面的渲染,二是实现 Api 接口调用。

这两部分功能是完全不一样的,在 Gin 中可以用两个不同的路由组来隔离逻辑。

router := gin.Default()
// 指定模板文件所在的路径
router.LoadHTMLGlob("templates/*.html")
// 渲染html的路由组
htmlGroup := router.Group("")
// api 处理的路由组
apiGroup := router.Group("api")

再更近一步,可以将 API 路由组再细分为公共 API 和私有 API。

// 公共API路由组
publicGroup := apiGroup.Group("public")
// 私有API路由组,绑定鉴权中间件
privateGroup := apiGroup.Group("")
privateGroup.Use(middleware.AdminAuth)

二、API 接口实现

创建一个简单的 GET 接口,并返回一条字符串数据内容。

apiGroup.GET("/health", func(c *gin.Context) {
	c.String(200, "ok health")
})

返回一个 JSON 数据:

apiGroup.GET("/health", func(c *gin.Context) {
	c.AbortWithStatusJSON(200, map[string]string{"msg": "ok health"})
})

三、HTML 模板渲染

渲染模板用的是 Go 内置的 html.template 工具包,Gin 对该工具包进行了集成,在渲染 Html 模板前需要先在 *gin.Engine 路由上指定模板文件所在的位置。

必须在 *gin.Engine 路由上指定,不能在路由组上指定。

有两个方法可以指定模板位置:

router.LoadHTMLGlob 函数可以指定一个路径,模糊匹配下的模板文件。

// 指定模板所在的目录
router.LoadHTMLGlob("templates/*")
// 指定模板文件为html文件
router.LoadHTMLGlob("templates/*.html")
// 当模板在多级目录下时
router.LoadHTMLGlob("templates/**/*.html")

router.LoadHTMLFiles 函数用于直接指定模板文件名称,可以同时指定多个文件。

router.LoadHTMLFiles("templates/index.html", "templates/page/index.html")

模板接口:

通过如下方法就可以指定渲染模板。

htmlGroup.GET("/index.html", func(c *gin.Context) {
	c.HTML(http.StatusOK, "index.html", gin.H{
		"title": "玖涯菜菜子",
	})
})

四、HTML 模板的缺陷

通过章节三的方法可以实现模板,但是这个方法是存在一些问题的,或者说是存在一些限制。因为 Gin 只是简单集成了这个模板框架,并没有怎么考虑一些细节问题。

模板访问问题

注册了 templates/page/index.html 模板,但是通过 templates/page/index.html 或者 page/index.html 会发现访问不到模板,只能通过 index.html 访问。

原因: 在注册模板时以文件名作为模板名称,所以c.HTML函数中只要模板文件名,不带模板所在的目录。如果不同目录出现多个同名文件,模板将相互覆盖。

如上例子中,router.LoadHTMLFiles("templates/index.html", "templates/page/index.html") 这两个文件中,templates/index.html 文件会被覆盖的。

解决方法: 在模板中通过 define 关键字为模板中的代码片断赋予一个新名称,然后通过这个名称访问模板。

{{ define "test/index.html" }}
test
{{ end }}

多次注册模板只有最后一次注册能生效

执行了多次 router.LoadHTMLGlobrouter.LoadHTMLFiles 函数,只有最后一次注册的内容能够生效。

原因: 每执行一次上面的方法都会重置 Gin 的 HTMLRender 属性,而这个属性存储着模板信息,所以每一次调这个函数都会重置模板状态。

解决方法: 通过官方接口无法解决,需要自己继承 HTMLRender 写一个 HTML 渲染的接口实现,在一个章节细说。

LoadHTMLGlob 指定多级目录会报错

原因: 使用 **/* 这种方式指定了两级目录,如果不存在两级目录,程序运行将会出错。

解决方法: 通过官方的接口无法解决,可自己继承 HTMLRender 写一个 HTML 渲染的接口解决。

以上问题可通过继承 HTMLRender 自定义 Gin 的模板渲染工具解决,小玖在后面的章节中详细介绍。:tushe:


http://www.kler.cn/a/228427.html

相关文章:

  • 【前端知识】简单易懂的vue前端页面元素权限控制
  • 26考研资料分享 百度网盘
  • opengrok_windows_环境搭建
  • R语言基础| 回归分析
  • Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)
  • CTTSHOW-WEB入门-爆破25-28
  • 超越原生:探索Node.js中最佳文件系统三方库
  • 新概念英语第二册(53)
  • 小华和小为的聚餐地点 - 华为OD统一考试
  • [linux] kolla-ansible 部署的openstack 修改mariadb默认端口号
  • Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)
  • 3593 蓝桥杯 查找最大元素 简单
  • 计算机网络(复习资料)
  • EasyX图形库学习(二、文字输出)
  • vulhub中Apache APISIX Dashboard API权限绕过导致RCE(CVE-2021-45232)
  • 【STM32+HAL库+CubeMX】UART轮询收发、中断收发、DMA收发方法及空闲中断详解
  • 了解 WebSocket 和 TCP :有何不同
  • Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框
  • Java智慧云智能教育平台
  • 云计算、Docker、K8S问题
  • JupyterLab 更换内核 使用 conda 虚拟环境
  • apk反编译修改教程系列---修改apk的默认颜色 布局颜色 手机电脑同步演示【十】
  • 面试经典150题——文本左右对齐(困难)
  • MagicVideo-V2:多阶段高保真视频生成框架
  • git将项目的某次签入遴选(Cherry-Pick)另一个项目
  • Open CASCADE学习|分割曲线