Gin框架: 路由解析与分组详解

Go Web——Gin实现路由分组 Gin实现路由分组 阅读详情

参数获取与表单处理


1 )参数获取, 处理 Query 和 Params 请求

package main

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

var statusOK = http.StatusOK

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()

	// 首页
	r.GET("/", func(c *gin.Context) {
		c.String(statusOK, "Welcome to %v", "Home Page")
	})

	// 用户页面
	r.GET("/user", func(c *gin.Context) {
		uid := c.Query("uid")
		page := c.DefaultQuery("page", "0") // 不传这个值,把0当做其默认值
		c.String(statusOK, "uid=%v page=%v", uid, page)
	})

	// 新闻页面
	r.GET("/news/:nid", func(c *gin.Context) {
		nid := c.Param("nid")
		c.String(statusOK, "newsID=%s", nid)
	})

	r.Run()
}
  • 访问: /user, 页面渲染出来的是: uid= page=0
  • 访问: /user?uid=1&page=1, 页面渲染出来的是: uid=1 page=1
  • 访问: /news/1, 页面渲染出来的是: newsID=1

2 )表单处理

  • 首先看下设定的结构

    yourGinProject/ ·······························  根目录
      ├── go.mod ··································  go mod 文件
      ├── go.sum ··································  go sum 文件
      ├── main.go ·································  main 文件
      └── tpls ····································· html模板目录
    	    └── web
    	          ├── profile.html
    	          └── user.html
    
  • 再设计下路由访问

    • GET /profile 获取 profile 页面
    • POST /doAddProfile 提交 profile 页面表单处理
    • GET /user 获取 user 页面
    • POST /doAddUser 提交 user 页面表单处理
    • GET /getUser?username=zhangsan&password=1111 查询某条user数据
    • POST /xml 提交xml数据处理
  • 主程序

    package main
    
    import (
    	"encoding/xml"
    	"net/http"
    	"github.com/gin-gonic/gin"
    )
    
    var statusOK = http.StatusOK
    var statusBadRequest = http.StatusBadRequest
    
    type UserInfo struct {
    	Username string `json:"username" form:"username"`
    	Password string `json:"password" form:"password"`
    }
    
    type Article struct {
    	Title   string `json:"title" xml:"title"`
    	Content string `json:"content" xml:"content"`
    }
    
    func main() {
    	// 创建一个默认的路由引擎
    	r := gin.Default()
    	// 加载模板 放在配置路由前面
    	r.LoadHTMLGlob("tpls/**/*")
    
      // 首页
    	r.GET("/", func(c *gin.Context) {
    		c.String(statusOK, "Welcome to %v", "Home Page")
    	})
    
    	// ---------------- profile 页面处理 --------------------
    	// 配置可访问的profile页面可以进行post演示
    	r.GET("/profile", func(c *gin.Context) {
    		c.HTML(statusOK, "web/profile.html", gin.H{})
    	})
    
    	// 获取表单post过来的数据
    	r.POST("/doAddProfile", func(c *gin.Context) {
    		// 参数处理
    		username := c.PostForm("username")
    		password := c.PostForm("password")
    		age := c.DefaultPostForm("age", "20") // 这里有一个默认的参数
    
    		// 响应出去
    		c.JSON(statusOK, gin.H{
    			"username": username,
    			"password": password,
    			"age":      age,
    		})
    	})
    
    	// ---------------- user 页面处理 --------------------
    	// 配置可访问的user页面可以进行post演示
    	r.GET("/user", func(c *gin.Context) {
    		c.HTML(statusOK, "web/user.html", gin.H{})
    	})
    
    	// 处理user页面提交出来的数据
    	r.POST("/doAddUser", func(c *gin.Context) {
    		// user结构体会作为接收参数的结构
    		user := &UserInfo{}
    		// 正常情况,使用 ShouldBind 来处理
    		// .ShouldBind()强大的功能,它能够基于请求自动
    		// 提取 JSON、form 表单和 QueryString 类型的数据
    		// 并把值绑定到指定的结构体对象
    		if err := c.ShouldBind(&user); err == nil {
    			// c.JSON(statusOK, &user)
    			c.JSON(statusOK, user) // 上下两者均可
    		} else {
    			// 错误处理
    			c.JSON(statusBadRequest, gin.H{
    				"err": err.Error(),
    			})
    		}
    	})
    
    	// ---------------- 模拟查询user接口 --------------------
    	// 访问参考: /getUser?username=zhangsan&password=1111
    	r.GET("/getUser", func(c *gin.Context) {
    		// 设定user结构体
    		user := &UserInfo{}
    		// 处理参数
    		if err := c.ShouldBind(&user); err == nil {
    			c.JSON(http.StatusOK, user)
    		} else {
    			c.JSON(http.StatusOK, gin.H{
    				"err": err.Error(),
    			})
    		}
    	})
    
    	// ---------------- 这里使用 postman 来提交xml --------------------
    	// 获取 Post Xml 数据
    	r.POST("/xml", func(c *gin.Context) {
    		// 准备结构体
    		article := &Article{}
    		// 获取原生xml数据
    		xmlSliceData, _ := c.GetRawData() //获取 c.Request.Body 读取请求数据
    
    		if err := xml.Unmarshal(xmlSliceData, &article); err == nil {
    			c.JSON(statusOK, article)
    		} else {
    			c.JSON(statusBadRequest, gin.H{
    				"err": err.Error(),
    			})
    		}
    	})
    
    	r.Run()
    }
    
  • html 页面

    • web/profile.html
      {{ define "web/profile.html" }}
      
        <form action="/doAddProfile" method="post">
            
            用户名:<input type="text" name="username" /> <br><br>
            密码:<input type="password" name="password" /> <br><br>      
      
            <input type="submit" value="提交">
        </form>
      
      {{end}}
      
    • web/user.html
      {{ define "web/user.html" }}
      
        <form action="/doAddUser" method="post">
            
            用户名:<input type="text" name="username" /> <br><br>
            密码:<input type="password" name="password" /> <br><br>      
      
            <input type="submit" value="提交">
        </form>
      
      {{end}}
      
  • 特别地,提交xml时的设置与响应

路由分组处理

1 )简单分组

主程序

package main

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

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	
	// 默认分组
	defaultRouters := r.Group("/")
	{
		defaultRouters.GET("/", func(c *gin.Context) {
			c.String(200, "首页")
		})
		defaultRouters.GET("/news", func(c *gin.Context) {
			c.String(200, "新闻")
		})
	}
	
	// api分组
	apiRouters := r.Group("/api")
	{
		apiRouters.GET("/", func(c *gin.Context) {
			c.String(200, "我是一个api接口")
		})
		apiRouters.GET("/userlist", func(c *gin.Context) {
			c.String(200, "我是一个api接口-userlist")
		})
		apiRouters.GET("/plist", func(c *gin.Context) {
			c.String(200, "我是一个api接口-plist")
		})
	}
	
	// admin分组
	adminRouters := r.Group("/admin")
	{
		adminRouters.GET("/", func(c *gin.Context) {
			c.String(200, "后台首页")
		})
		adminRouters.GET("/user", func(c *gin.Context) {
			c.String(200, "用户列表")
		})
		adminRouters.GET("/article", func(c *gin.Context) {
			c.String(200, "新闻列表")
		})
	}

	r.Run()
}

2 )按文件分组

  • 首先看下设定的结构
    yourGinProject/ ·······························  根目录
      ├── go.mod ··································  go mod 文件
      ├── go.sum ··································  go sum 文件
      ├── main.go ·································  main 文件
      └── tpls ····································· html模板目录
      |	    └── web
      |	          └── index.html
      └── routers ·································· 路由配置目录
    		├── webRouters.go
    		├── apiRouters.go
    		└── adminRouters.go
    

2.1 主程序

package main

import (
	"gin-demo/routers" // 注意,这里gin-demo是项目名称,需要一开始 go mod init gin-demo
	"github.com/gin-gonic/gin"
)

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()

	// 配置默认路由
	routers.WebRoutersInit(r)
	
	// 配置api
	routers.ApiRoutersInit(r)

	// 配置admin
	routers.AdminRoutersInit(r)

	r.Run()
}

2.2 routers 包

2.1 webRouters.go

package routers

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

var statusOK = http.StatusOK

func WebRoutersInit(r *gin.Engine) {
	r.LoadHTMLGlob("tpls/**/*") // 配置模板路径,如果是通用的,这个配置应放在 main.go 中
	webRouters := r.Group("/")
	{
		webRouters.GET("/", func(c *gin.Context) {
			c.HTML(statusOK, "web/index.html", gin.H{
				"msg": "我是一个msg",
			})
		})
		webRouters.GET("/news", func(c *gin.Context) {
			c.String(statusOK, "新闻")
		})
	}
}

2.2 apiRouters.go

package routers

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

func ApiRoutersInit(r *gin.Engine) {
	apiRouters := r.Group("/api")
	{
		apiRouters.GET("/", func(c *gin.Context) {
			c.String(200, "我是一个api接口")
		})
		apiRouters.GET("/userlist", func(c *gin.Context) {
			c.String(200, "我是一个api接口-userlist")
		})
	}
}

2.3 adminRouters.go

package routers

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

func AdminRoutersInit(r *gin.Engine) {
	adminRouters := r.Group("/admin")
	{
		adminRouters.GET("/", func(c *gin.Context) {
			c.String(200, "后台首页")
		})
		adminRouters.GET("/user", func(c *gin.Context) {
			c.String(200, "用户列表")
		})
	}
}
golang——Gin框架及路由介绍 gin框架中采用的路由库是基于httprouter做的支持Restful风格的API,意思是"表面层状态转化",是一个互联网应用程序的API设计理念:URL定位资源。可以创建路由组,为了管理相同的URL。import ("net/http"//将应用切换到“发布模式”以提升性能//创建路由//默认使用了两个中间件Logger(),Recovery()})})//路由组1})})//路由组2})})//监听端口,默认绑定端口8080。 阅读详情

相关推荐

【Golang】Gin框架中如何定义路由

Gin是一个用Go语言编写的Web框架,具有高性能和易于使用的特点。在Gin框架中,路由是核心功能之一,通过路由可以将不同的URL路径绑定到相应的处理函数上。本文将结合实际案例,详细介绍Gin框架的路由用法。

景天科技苑 5万+

gin框架学习-路由分组和中间件

gin框架学习-路由分组和中间件

林钟一的博客 4056

单机多环境部署apollo 2.3.0

理解apollo的整体架构后,对比nacos配置中心功能点,其设计的复杂度以及完整度相较nacos而言更为丰富 对于不同的环境,例如 FAT, PRO 在部署时进程已经完全物理隔离,并且每个环境config/adminservice依赖的数据也完全物理隔离(连接不同的db),在数据隔离与安全方面做的很完善,但同时也提升了架构的复杂度 而 portal 可以管理多个环境,单节点部署虽然有单点问题,但并不会影响业务从configservice读取配置, 挂掉只要重启就可以,只是在

Life is a starting point everywhere 1300

2. Gin路由分组

Gin路由分组功能

菜鸟的博客 1115

Rockchip MPP解码H264实战:从文件到YUV的完整流程解析

本文详细解析了在Rockchip平台上使用MPP(Media Process Platform)硬件解码H264视频文件并输出YUV数据的完整流程。通过实战代码示例,深入讲解了MPP解码器的初始化、数据包投递、非阻塞模式下的双循环控制以及YUV帧的提取与保存等核心步骤,并提供了环境搭建、编译运行和常见问题排查指南,帮助开发者高效利用硬件加速进行视频处理。

life6的博客 480

三极管高频响应问题及其在放大设计中的优化

深入解析三极管工作原理及详解其在高频下的响应特性,针对放大电路设计中的性能瓶颈,提出有效的优化策略,提升电路稳定性和频率响应能力。

weixin_42497762的博客 773

7.Gin 路由详解 - 路由分组 - 路由文件抽离

7.Gin 路由详解 - 路由分组 - 路由文件抽离前言在前面的示例中,我们直接将路由的定义全部写在 main.go 文件中,如果后面 路由越来越多,那将会越来越不好管理。所以,下一步我们应该考虑将路由进行分组管理,并且将其抽离 main.go的文件。1696330394289路由分组我们可以将相同模块路径的作为一组,将路由进行分组处理。1696330862506//2.1路由分组 //设置...

DevOps海洋的渔夫@专栏 749

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4868

Golang Gin框架路由分组分文件

使用Gin框架写Go项目的时候,如果把路由都写在一个.go文件中,随着路由的数量的增加,会导致路由文件显得异常臃肿。分组后的go代码,虽然路由都实现路由分组,路由的逻辑显得清晰,但是路由文件还是集中在一个文件中,文件还是大。此时需要对路由进行分组并且分文件管理,更有利于代码的组织和维护,更好把项目做大,做强,再创辉煌。

地球流浪猫的博客 925

本地部署了qwen2.5:0.8b ,对接openclaw 后,电脑卡的要死

OpenClaw 强制 16k 上下文 + 无限历史 + Agent 调度,把 0.8b 压垮。按上面配置:轻量化 + 限历史 + 驻留显存,电脑立刻不卡。

专注于技术研发行业技术主要有AI人工智能视觉识别、物联网技术、电商平台、app原生技术、微信小程序、鸿蒙语言开发、办公企业oa、ERP等,致力于做东半球最优秀的程序员 978

Python脚本自动化芯片设计?PyAether实战教程带你玩转EDA

本文通过PyAether实战教程,详细介绍了如何利用Python脚本实现芯片设计自动化。内容涵盖环境搭建、核心对象模型解析,并重点演示了原理图自动生成、参数化单元创建及设计验证流程集成,帮助EDA工程师从重复性手动操作中解放,显著提升设计效率与一致性。

e4f5g6h的博客 1319

【Gin框架入门到精通系列04】Gin中的路由分组

本文深入介绍Gin框架的路由分组功能,包括基础路由分组、嵌套分组技术以及API版本控制实现,通过系统化的讲解和实战代码示例,帮助开发者构建结构清晰、易于维护的大型Web应用。

GopherTribe的博客 1496

SAP成本控制范围配置全流程:从货币参数到标准层次(附2024最新SPRO路径)

本文详细拆解了SAP成本控制范围(Controlling Area)的完整配置流程,涵盖从货币与估价参数文件定义、参数文件分配到控制范围,再到成本中心标准层次创建等核心步骤。文章提供了2024年最新的SPRO导航路径和实战配置要点,帮助顾问构建稳健、可扩展的管理会计基础架构,并附有常见问题排查指南。

java5的博客 940

Gin笔记二之gin.Engine和路由设置

除了设置单个路由,我们还可以对路由进行分组设置,比如需要控制版本,或者模块设置需要统一的前缀,又或者是需要统一设置中间件功能的时候。中间件则可以为我们捕获程序中未处理的 panic,记录错误信息并返回 500 状态码信息,比如我们在第一篇笔记中使用的。框架为我们默认添加的对于开发者来说较为友好的两个操作,在后面介绍中间件的时候,我们也可以手动实现这两个功能。同时第三行输出路由信息的地方,标明了这个路由指向的处理函数,后面的括号里是。而如果我们需要向其中添加中间件的时候,也可以不用挨个路由进行设置,而是在。

KK5420452的博客 174

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Gin 路由系统完全指南:路径参数、通配符与路由分组一次学会

Gin 是 Go 语言生态中最受欢迎的开源高性能 HTTP Web 框架,凭借内置的路由树(radix tree)提供极速的路径匹配能力。本文将带你一次性学会 Gin 路由系统的三大核心:**路径参数(`:param`)**、**通配符(`*catchAll`)**与**路由分组(RouterGroup)**,并附上新手最常见的路由配置坑点与最佳实践,帮你快速搭建规范的 REST API 路由结构

gitblog_00059的博客 703

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

全网最强 Gin 教程 | 认识 Gin 框架

Gin 是一个用 Go 语言编写的高性能 Web 框架,以简洁、稳定、扩展性强著称,目前是 Go 官方推荐的 Web 框架。

qq_45832461的博客 1448

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Gin 从入门到实践:路由与 Context 深入解析

gin.Context 本质上是对 http.ResponseWriter 和 *http.Request 的封装,但它并不是简单的“组合”,而是围绕一次 HTTP 请求的生命周期,提供了一套完整的增强能力。从整体来看,Gin 并没有改变 HTTP 的本质,而是在 net/http 的基础上,通过对请求上下文、路由匹配和中间件机制的封装,提供了一套更加高效、易用的 Web 开发模型。当你创建一个 Group 时,Gin 会记录该组的前缀路径,并在注册子路由时自动拼接,同时继承该组绑定的中间件。

fcy222fcy的博客 549

Go Web框架gin(二)-路由分组和路由嵌套

路由组也可以嵌套,但是需要注意的是当进行嵌套时下一层的需要调用Group方法(设置路由前缀)是需要用上一层的进行调用: shopGroup := userGroup.Group("/shop") 代码 package main import ( "github.com/gin-gonic/gin" "net/http" ) // 路由的分组和嵌套 func main() { r := gin.Default() userGroup := r.Group("/user") { /

qq_32293345的博客 1474

golang学习笔记(19)-gin路由分组和中间件

gin中间件与路由分组

logiee的博客 1149

【Gin】| 框架源码解析 :路由详解

解析了Radix Tree及一些Engine中有关路由的函数源码。

theaipower的博客 7638

Go Web轻量级框架Gin学习系列:路由分组

在这篇文章中我们来讲一讲Gin框架路由(Router)的设置,Gin框架的路由设置非常简单,我们在前面几篇学习Gin框架的文章中,几乎每个示例都会见到Gin的路由定义,Gin框架就是通过定义路由以及处理该路由对应的Handler来接收用户的Web请求。 HttpRouter Gin框架的路由实际是使用第三方的HttpRouter库,HttpRouter是一个轻量级高性能的HTTP请求路由器(路由多...

weixin_34007879的博客 4097

【Golang】——Gin 框架中的路由与请求处理

在 Web 开发中,路由用于定义不同 URL 对应的请求处理逻辑。简单来说,路由决定了客户端发来的请求应由哪个处理函数来响应。例如,当客户端访问路径/users时,服务器会通过特定的路由配置来处理该请求并返回相应的结果。在 Gin 框架中,路由的定义非常灵活,可以通过简单的方法为不同的 URL 和 HTTP 请求方法(如 GET、POST 等)创建路由。Gin 支持路径参数、查询参数、表单参数等多种传参方式,使得处理不同请求类型变得简单直观。Gin 提供了路由分组。

Linke的博客 2185

Gin框架入门(三)—多路由分组

官方文档:https://godoc.org/github.com/gin-gonic/gin 官方地址:https://github.com/gin-gonic/gin 多路由分组 在平常我们经常会划分一个模块一组路由。 例如:goods为商品模块 www.haha.com/goods/addGoods 添加商品 www.haha.com/goods/delGoods 删除商品 这时我们把一...

Samdom的博客 1万+

Gin框架路由详解

gin框架使用的是定制版的httprouter,其路由的原理是大量使用公共前缀的树结构,它基本上是一个紧凑的Trie tree(或者只是Radix Tree)。具有公共前缀的节点也共享一个公共父节点。

qq_63730529的博客 1583

GIN路由机制深度解析与Python实践

本文面向中国AI应用开发者,深入剖析GIN框架的路由机制源码实现,结合Python实践,帮助读者理解高性能路由的设计思想与实现细节。文章配有架构图、流程图、思维导图、甘特图、饼图等多种可视化展示,辅以详细代码示例和最佳实践建议,助力开发者高效构建AI服务路由系统。路由是Web框架中将HTTP请求分发到对应处理函数的机制。路由的设计直接影响服务的性能、可扩展性和可维护性。本文系统解析了GIN路由机制的源码实现与设计思想,并结合Python实践演示了高效路由的构建方法。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1087
上一篇: Gin框架: HTML模板渲染之配置与语法详解
下一篇: Gin框架: 控制器, 中间件的分层设计案例
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值