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

Golang Gin系列-6:Gin 高级路由及URL参数

在本章中,我们将深入研究使用Gin框架的高级路由和URL参数。我们将介绍如何创建和使用路由组、应用中间件、提取路径参数、处理查询字符串、处理静态文件以及使用HTML模板。

路由分组

为什么要使用路由组

使用路由组有助于保持代码结构整洁有序。当路由被逻辑分组时,它变得更容易管理和扩展应用程序。例如,您可能有一组与用户管理相关的路由,另一组与产品管理相关的路由。

创建和使用路由分组

路由分组能够组织路由并应用通用中间件。这对于对共享公共路径前缀或需要相同中间件的路由进行分组特别有用。
在这里插入图片描述

示例:创建路由分组

在这个例子中,我们为API路由创建分组:

package main

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

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

    // Group: /api
    api := r.Group("/api")
    {
        api.GET("/users", getUsers)
        api.GET("/products", getProducts)
    }

    r.Run() // listen and serve on 0.0.0.0:8080
}

func getUsers(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "Fetching all users",
    })
}

func getProducts(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "Fetching all products",
    })
}

在这个例子中,‘ /api/users ’和‘ /api/products ’被分组在‘ /api ’路径下。

在路由分组中应用中间件

中间件功能对于处理诸如身份验证、日志记录等任务至关重要。通过将中间件应用于路由组,可以确保组内的所有路由都由中间件处理。

示例:应用中间件

在这个例子中,我们将身份验证中间件应用到admin路由组:

package main

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

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

    // Group: /admin
    admin := r.Group("/admin")
    admin.Use(AuthMiddleware())
    {
        admin.GET("/dashboard", adminDashboard)
        admin.GET("/settings", adminSettings)
    }

    r.Run()
}

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // Authentication logic
        if c.Request.Header.Get("Authorization") != "Bearer token" {
            c.AbortWithStatus(401)
            return
        }
        c.Next()
    }
}

func adminDashboard(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "Admin Dashboard",
    })
}

func adminSettings(c *gin.Context) {
    c.JSON(200, gin.H{
        "message": "Admin Settings",
    })
}

在这个例子中,‘ AuthMiddleware ’函数检查授权令牌。如果令牌不存在或不正确,请求将以401状态中止。

路径参数和查询字符串

提取路径参数

路径参数允许你在URL中传递数据,使得路由更加动态化。在Gin中的Param方法,你可以使用c 提取这些参数。

示例:提取路径参数

package main

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

func main() {
    r := gin.Default()
    r.GET("/user/:id", getUser)
    r.Run()
}

func getUser(c *gin.Context) {
    userID := c.Param("id")
    c.JSON(200, gin.H{
        "user_id": userID,
    })
}

在这个例子中,当向‘ /user/123 ’发出请求时,‘ userID ’变量将是‘ 123 ’。

使用查询字符串

查询字符串是在URL中传递数据的另一种方式。它们通常用于过滤、排序和分页。您可以使用c 来检索查询字符串参数。查询的方法。

示例:使用查询字符串

package main

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

func main() {
    r := gin.Default()
    r.GET("/search", search)
    r.Run()
}

func search(c *gin.Context) {
    query := c.Query("q")
    c.JSON(200, gin.H{
        "query": query,
    })
}

在本例中,当向’ /search?q=golang’,则 ‘query’ 变量将为 'golang '。

处理静态文件和模板

提供静态文件

使用Gin提供静态文件(如图像、CSS和JavaScript文件)非常简单。用“r.static”方法提供静态文件目录。

示例:提供静态文件

package main

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

func main() {
    r := gin.Default()
    r.Static("/assets", "./assets")
    r.Run()
}

在这个例子中,任何对‘ /assets ’的请求都将从’./assets’的目录中提供文件。例如,对‘ /assets/style.css ’的请求将从‘ ./assets ’目录中获取‘ style.css ’文件。

使用HTML模板与Gin

Gin支持使用‘ HTML ’方法呈现HTML模板。首先,使用‘ LoadHTMLGlob ’或‘ LoadHTMLFiles ’加载模板。

示例:使用HTML模板

package main

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

func main() {
    r := gin.Default()
    r.LoadHTMLGlob("templates/*")
    
    r.GET("/index", func(c *gin.Context) {
        c.HTML(200, "index.tmpl", gin.H{
            "title": "Main website",
        })
    })
    
    r.Run()
}

templates目录中创建index.tmpl文件:

<!DOCTYPE html>
<html>
<head>
    <title>{{ .title }}</title>
</head>
<body>
    <h1>{{ .title }}</h1>
</body>
</html>

在这个例子中,对‘ /index ’的请求将渲染 ‘index.tmpl’ 模板,并提供title变量为“Main webSite”。

最后总结

通过本文中的示例,你应该能够在Gin应用程序中有效地利用高级路由和URL参数。Gin,愈学习愈快乐, Go!


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

相关文章:

  • uniapp——App 监听下载文件状态,打开文件(三)
  • MySQL面试题2025 每日20道【其四】
  • Mac 上如何安装Mysql? 如何配置 Mysql?以及如何开启并使用MySQL
  • 计算机网络 | IP地址、子网掩码、网络地址、主机地址计算方式详解
  • Linux-性能分析top
  • Phi小模型开发教程:用C#开发本地部署AI聊天工具,只需CPU,不需要GPU,3G内存就可以运行,不输GPT-3.5
  • TIM定时中断
  • vue动态修改网页icon图标【浏览器】
  • ARCGIS国土超级工具集1.3更新说明
  • (7)(7.2) 围栏
  • 第四届机器学习、云计算与智能挖掘国际会议
  • C++:bfs解决多源最短路与拓扑排序问题习题
  • games101笔记-02线性代数回顾
  • 第01章 07 MySQL+VTK C++示例代码,实现医学影像数据的IO数据库存储
  • 构建基于Hadoop的数据湖解决方案
  • 通过以太网加载linux内核、设备树、根文件系统方法(以stm32MP135为例)
  • 插入排序 计数排序 堆排序 快速排序 归并排序
  • 降维算法:主成分分析
  • Dockerfile另一种使用普通用户启动的方式
  • 高效建站指南:通过Portainer快速搭建自己的在线网站
  • 开源许可证(Open Source Licenses)
  • 【React】类组件更新的底层逻辑
  • wordpress网站发布失败:此响应不是合法的JSON响应
  • 模版字符串复制粘贴支持换行
  • 【Block总结】TFF和SFF模块,时间和尺度的特征融合|即插即用
  • 【大数据2025】Yarn 总结