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

参数获取与表单处理


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

package mainimport ("net/http""github.com/gin-gonic/gin"
)var statusOK = http.StatusOKfunc 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│     └── index.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 mainimport ("encoding/xml""net/http""github.com/gin-gonic/gin"
    )var statusOK = http.StatusOK
    var statusBadRequest = http.StatusBadRequesttype 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=1111r.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 mainimport ("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 mainimport ("gin-demo/routers" // 注意,这里gin-demo是项目名称,需要一开始 go mod init gin-demo"github.com/gin-gonic/gin"
)func main() {// 创建一个默认的路由引擎r := gin.Default()// 配置默认路由routers.WebRoutersInit(r)// 配置apirouters.ApiRoutersInit(r)// 配置adminrouters.AdminRoutersInit(r)r.Run()
}

2.2 routers 包

2.1 webRouters.go

package routersimport ("net/http""github.com/gin-gonic/gin"
)var statusOK = http.StatusOKfunc 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 routersimport "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 routersimport "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, "用户列表")})}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在IDEA中使用固定公网地址SSH远程连接服务器开发环境

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

【git 使用】超级好用的 git reset 和 git revert 功能对比和使用方法

首先你要知道 git 区分暂存区和工作区&#xff0c;如果你用过 sourcetree 你就会知道 git reset 超级好用 git reset 命令用于将当前分支的 HEAD 指针移动到指定的提交&#xff0c;并且可以选择性地修改工作区和暂存区的状态。git reset 命令有几种常用的用法&#xff0c;主要…

【JPCS出版|EI稳定检索】2024年第四届人工智能与工业技术应用国际学术会议(AIITA 2024)

2024年第四届人工智能与工业技术应用国际学术会议&#xff08;AIITA 2024&#xff09; 2024 4th International Conference on Artificial Intelligence and Industrial Technology Applications 2024年4月12日-14日 | 中国广州 大会官网&#xff1a;www.aiita.net 二轮截稿…

【项目管理】CMMI-项目监督和控制

项目监督和控制&#xff08;Monitoring and Control, MC&#xff09;的目的是通过周期性地跟踪项目计划的各种性能参数如工作产品的规模、工作量、成本、进度、风险等&#xff0c;不断地了解项目的进展情况&#xff0c;以便当项目实际进展状况显著偏离项目计划时能够及时采取纠…

shapely 笔记 voronoi图

Voronoi 图是一种将平面分割成区域的方法&#xff0c;每个区域包含一个输入点&#xff0c;任何在该区域内的点都比其他输入点更接近该区域的输入点 1 基本使用方法 shapely.ops.voronoi_diagram(geom, envelopeNone, tolerance0.0, edgesFalse) 2 参数说明 geom任何几何类型…

Recorder 实现语音录制并上传到后端(兼容PC和移动端)

Recorder 首页&#xff1a;https://github.com/xiangyuecn/Recorder 一、安装 npm install recorder-core二、代码部分 1. HTML页面 <template><div><el-inputv-model"ttsText"type"textarea"placeholder"请输入内容"><…

Django学习笔记-创建第一个django项目

1.创建一个虚拟环境的python项目 2.点击解释器设置 3.安装django包 4.终端选择Command Prompt 5.创建django项目运行django-admin startproject demo01(自命名) 6.修改连接数据库为mysql 7.修改语言(中国汉语)和时区(亚洲上海)USE_TZ改为False,否则时区不生效 8.修改TEMPLA…

python毕设选题 - 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到…

js设计模式:迭代器模式

作用: 对数据对象进行有序的迭代操作,可以按顺序处理每一个元素 并且可以根据当前步骤的处理结果决定下一个步骤是否操作 示例: class Life {constructor(data) {this.data datathis.child data.childthis.young data.youngthis.middle data.middlethis.old data.old}/…

外贸人大部分都复工了吧

这几天是属于国家规定的节后上班时间&#xff0c;估计大部分人都已经开始复工了。作为粤西地区小伙伴中的一员&#xff0c;表示虽然身在广州&#xff0c;心却还在高州&#xff0c;毕竟年例在这些天才刚刚开始&#xff0c;我们那边每年最热闹的时候就是年例了&#xff01; 由于…

零基础入门金融风控-贷款违约预测Task2 数据分析

Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分&#xff0c;带你来了解数据&#xff0c;熟悉数据&#xff0c;为后续的特征工程做准备&#xff0c;欢迎大家后续多多交流。 赛题&#xff1a;零基础入门数据挖掘 - 零基础入门金融风控之贷款违约 目的&#…

第二件事 在Java 虚拟机 (JVM)跑一个程序

上篇文章写了 在 WINDOWS上 创建了一个 JVM&#xff0c; 好&#xff01; 现在在这个 Java 虚拟计算机系统上跑一个Java语言编写的小程序&#xff1b; 题目&#xff1a; 用Java语言 编写一个小程序 在Console界面 打印 整数 1-10 (回头了一下源程序&#xff0c;靠&#xff0c;应…