gin 获取get 所有参数_Golang Gin 实战(三)

2023-11-18

在 上一篇 Golang Gin 实战(二)| 简便的Restful API 实现 文章中,我们留了一个疑问,假如我们有很多用户,我们要为他们一个个注册路由(路径)吗?

路由路径

如下URL:

/users/123
/users/456
/users/23456

以上等等,我们有很多用户,如果我们都一个个为这些用户注册这些路由(URL),那么我们是很难注册完的,而且我们还会有新注册的用户,可见这种办法不行。

我们观察这些路由(URL),发现它们具备一定的规则:前面都是users,后面是usersid。这样我们就可以把这些路由归纳为:

/users/id

这样我们就知道只有id这部分是可以变的,前面的users是不变的。可变的id可以当成我们API服务输入的参数,这样我们就可以通过这个id参数,获取对应的用户信息,这种URL匹配的模式,我们称之为路由参数。

路由参数

Gin中,要实现以上路由参数非常简单:

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

    r.GET("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        c.String(200, "The user id is  %s", id)
    })
    r.Run(":8080")
}

我们运行如上代码,打开浏览器,输入http://localhost:8080/users/123,就可以看到如下信息:

The user id is  123

我们可以更换http://localhost:8080/users/123中的id 123 为其他字符串,会发现都可以正常打印,这就是路由匹配、路由正则,或者路由参数。

Gin的路由采用的是httprouter,所以它的路由参数的定义和httprouter也是一样的。

/users/:id 就是一种路由匹配模式,也是一个通配符,其中:id就是一个路由参数,我们可以通过c.Param("id")获取定义的路由参数的值,然后用来做事情,比如打印出来。

/users/:id这种匹配模式是精确匹配的,只能匹配一个,我们举几个例子说明:

Pattern: /users/:id

/users/123          匹配
/users/哈哈        匹配
/users/123/go      不匹配
/users/             不匹配

这里我故意写了/users/哈哈,并且是匹配的,意思就是对于Gin路径中的匹配都是字符串,它是不区分数字、字母和汉字的,都匹配。

这里还需要说明的是,Gin的路由是单一的,不能有重复。比如这里我们注册了/users/:id,那么我们就不能再注册匹配/users/:id模式的路由,比如:

r.GET("/users/list", func(c *gin.Context) {
    //省略无关代码
})

这时候我们运行程序的话,会出现如下提示:

panic: 'list' in new path '/users/list' conflicts with existing wildcard ':id' in existing prefix '/users/:id'

通配符重复了,路由必须要唯一。Gin内部使用的路由是httprouter,我这里前段时间正好有一篇关于httprouter的详细分析,可以看下。Go语言经典库使用分析(七)| 高性能可扩展HTTP路由httprouter

星号路由参数

上面我们介绍的是:号的路由参数,这种路由参数最常用。还有一种不常用的就是*号类型的参数,表示匹配所有。

/users/*id为例:

Pattern: /users/*id

/users/123         匹配
/users/哈哈        匹配
/users/123/go      匹配
/users/            匹配

我们把上面的例子改下:

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

    r.GET("/users/*id", func(c *gin.Context) {
        id := c.Param("id")
        c.String(200, "The user id is  %s", id)
    })
    r.Run(":8080")
}

现在我们运行,浏览器里访问http://localhost:8080/users/123,会看到如下信息:

The user id is  /123

是否发现区别了,我们获取到的id不是123了,而是/123,多了一个/

同样的你试试http://localhost:8080/users/123/go会发现显示的信息是:

The user id is  /123/go

是一个/开头的路径字符串。

这里要特别说明一点的是,如果你用浏览器访问http://localhost:8080/users,会被重定向到http://localhost:8080/users/,然后显示的信息如下:

The user id is  /

重定向的根本原因在于/users没有匹配的路由,但是有匹配/users/的路由,所以就会被重定向到/users/。现在我们注册一个/users来验证下这个猜测:

r.GET("/users", func(c *gin.Context) {
    c.String(200, "这是真正的/users")
})

现在再访问http://localhost:8080/users,会看到显示的信息变成了:

这是真正的/users

这也间接证明了/users/*id/users这两个路由是不冲突的,可以被Gin注册。

以上自动重定向的原理,得益于gin.RedirectTrailingSlash 等于true的配置。如果我们把它改为false就不会自动重定向了。

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

    r.RedirectTrailingSlash = false
    r.GET("/users/*id", func(c *gin.Context) {
        id := c.Param("id")
        c.String(200, "The user id is  %s", id)
    })

    r.Run(":8080")
}

现在我们运行程序,访问http://localhost:8080/users发现显示的信息是404 page not found

小结

这一篇主要介绍路由参数,并且基于这种参数,我们可以很灵活的实现我们的API,并且从路径中获取相应的参数进行操作。对于*号参数,不建议使用,因为匹配的太多,会导致我们自己搞不清楚哪些路由被注册了。

除了路由参数,还有URL的query参数,也就是?a=b&c=d这样的格式,下一篇文章我们再介绍。

感谢新老朋友的转发、阅读和点赞支持,给大家抽个现金红包(点击参与),在看到50,下次抽奖增加金额!

我有上千人的Go语言交流群,可以扫码关注公众号flysnow_org或者网站 https://www.flysnow.org/,加我微信好友,我拉你进来。

往期 精彩回顾Golang Gin 实战(二)| 简便的Restful API 实现Golang Gin 实战(一)| 快速安装入门
Go语言经典库使用分析(七)| 高性能可扩展HTTP路由httprouter

e5802d0328642c53805847a512c94bb9.png

扫码关注

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gin 获取get 所有参数_Golang Gin 实战(三) 的相关文章

  • win10系统mysql开发常见问题集锦

    目录 一 mysql56 系统找不到指定文件 二 mysqldump Error Binlogging on server not active 无法导出数据 三 mysql备份导出的数据为空 四 mysql事件不执行 五 修改mysql密
  • python读取文件存到excel中

    用xlwt模块执行代码报下面的错 ValueError column index 256 not an int in range 256 xlwt 模块看源码说最大列只支持255列 所以超过这个值就报错了 改用xlsxwriter模块 im
  • pygame实现飞机大战-第二版代码分析

    目录 一 原代码 第一部分 精灵定义部分 第二部分 游戏运行部分 二 代码分析 一 代码整体结构 1 定义了main 2 创建游戏对象 3 启动游戏 二 局部代码分析 1 精灵的定义 2 主游戏类定义 3 主程序运行 4 细节分析 三 心得
  • Gradle for Android 第三篇( 依赖管理 )

    转自 https segmentfault com a 1190000004237922 依赖管理 这会是一个系列 所以如果你还没有看我之前的几篇文章 请先查看以下文章 Gradle for Android 第一篇 从 Gradle 和 A
  • 【论文精读】QLORA: Efficient Finetuning of Quantized LLMs

    QLORA Efficient Finetuning of Quantized LLMs 前言 Abstract Introduction Background Block wise k bit Quantization Low rank
  • element的嵌套dialog,在打开第二个dialog的时候会被遮罩层遮住

    element嵌套dialog遮罩层的问题 做项目的时候遇到一个问题 在一个弹出层的内容区做处理打开另一个弹出层时 第二个弹出层会被遮罩层遮住 点击五次之后遮罩层关闭 然后才发现 element 的dialog嵌套问题 之所以第二次弹出的会
  • 华为OD机试真题 Java 实现【区块链文件转储系统】【2023Q2 200分】,附详细解题思路

    一 题目描述 区块链底层存储是一个链式文件系统 由顺序的N个文件组成 每个文件的大小不一 依次为F1 F2 Fn 随着时间的推移 所占存储会越来越大 云平台考虑将区块链按文件转储到廉价的SATA盘 只有连续的区块链文件才能转储到SATA盘上
  • 安全基础 --- JSON + 函数声明

    JSON 格式 JSON JavaScript Object Notation缩写 是一种用于数据交换的文本格式 目的是取代繁琐笨重的 XML 格式 1 规定 复合类型的值只能是数组或对象 不能是函数 正则表达式对象 日期对象 原始类型的值
  • centos是arm还是amd_amd系列cpu安装linux

    如何在 Linux 上安装 Intel 微代码固件 linux 的内核可以在引导时更新 cpu 固件 而无需 bios 更新 处理器的微码保存在内存中 在每次启动系统时 内核可以更新这个微码 这些来自 intelamd 的微码的更新可以去修
  • unity多个贴图shader

    在一个Material上放多个贴图的测试 比如一个plane上放四个贴图 Shader aaa Properties MainTex Texture 2D white MainTex2 Texture 2D white MainTex3 T
  • Summer Holiday HDU - 1827 强连通分量+缩点

    To see a World in a Grain of Sand And a Heaven in a Wild Flower Hold Infinity in the palm of your hand And Eternity in a
  • http 11ajax.co,Internet Explorer 11 crashes when Angulars $http.post is used with large/complex json...

    I am consistently able to crash IE11 when I post large complex json object using Angulars http post method I have setup
  • (最详细!)汇编原理中OF(溢出)和CF(进位)的判断方法

    关于这个问题百度查了半天 都没有比较全面的解释 所以我来了 首先我们需要知道 al是用两位16进制的数来保存数据的 所以正数最多保存0 255 十进制 FFH 处理器内部以补码表示有符号数 8个二进制位能够表达的整数范围是 127 128
  • llama2模型部署方案的简单调研-GPU显存占用(2023年7月25日版)

    先说结论 全精度llama2 7B最低显存要求 28GB 全精度llama2 13B最低显存要求 52GB 全精度llama2 70B最低显存要求 280GB 16精度llama2 7B预测最低显存要求 14GB 16精度llama2 13
  • three.js 楼层加载动画

    three js 楼层加载动画 概述 创建场景 创建天空 创建水面 创建模型 开启模型动画 栅栏动画 概述 如有不明白的可以加QQ 2354528292 wx aichitudousien 更多教学视频请访问 https space bil
  • 跋20230325

    很久没有登录csdn 突然上号一次发现n多的评论和私信 时间跨度从2021年到2023年 感谢大家的信任 但是消息太多 且现在笔者已经没有从事相关行业 大家的问题很有深度 都是我答不上来的 这里就不一 一进行回复了 请大佬们见谅 博文都是笔
  • java字符串基础操作

    1 字符串的特点 java lang String使用了final修饰 不能被继承 字符串底层封装了字符数组及针对字符数组的操作算法 字符串一旦创建 对象内容永远无法改变 但字符串引用 可以重新赋值 Java字符串在内存中采用Unicode
  • 今天发现rabbitMQ消息堆积

    发现有三十多万的消息堆积在10的queue里没有被消费 记录一下查看问题的步骤 1 jps 找出程序的PID 2 jstack PID 查看线程dump 发现rabbitMQ的consumer worker线程block住了 Thread
  • 转眼就来字节六个月了,真的不一样

    今天来分享一个学弟 也是我老乡 阿秀 他入职字节跳动 6 个月的感受 希望给向往大厂的小伙伴一点点信心和动力 一 过去 首先来回复下有些小伙伴对字节存在的疑问 1 字节 996 的生活长期来看没有啥意义 我觉得还是挺有意义的 因为见识到了自

随机推荐

  • 前后端分离总结(部分)

    本文内容转载于博客 前后端分离架构概述 https blog csdn net fuzhongmin05 article details 81591072 1 背景 前后端分离已成为互联网项目开发的业界标准使用方式 通过nginx tomc
  • Springboot中使用netty 实现 WebSocket 服务

    依赖
  • C语言:写文件

    C语言 写文件 在C语言中 我们可以使用标准库函数来创建 打开 写入和关闭文件 文件操作是处理数据的重要方面之一 它允许我们将数据永久保存在磁盘上 并在需要时进行读取和修改 本文将介绍如何在C语言中写入文件 并提供相应的源代码示例 首先 我
  • [Dynamics CRM]错误代码参考

    转载于 http it zhaozhao info archives 20266 0x80048472 One or more imports are not in completed state Imported records can
  • 【Darknet】模型隐藏的一种方法

    之前在一个公司实习的时候有个需求 说要把Darknet的模型隐藏起来 就是说提供给用户的只有dll 而cfg和weights文件不能直接给客户 不然就暴露商业机密了嘛 所以就研究了一下如何隐藏模型 主要参考这篇文章 具体原理咱也不是很懂 反
  • 微信小程序使用AES加密和解密

    前端请求后端接口进行参数加密处理 const CryptoJs require crypto js const defaultKey zoe nurse qazxr8 默认的key const defaultIv qwertyuiopasd
  • [性能测试]LR常见问题整理

    1 LR 脚本为空的解决方法 1 去掉ie设置中的第三方支持取消掉 2 在系统属性 高级 性能 数据执行保护中 添加loadrunner安装目录中的vugen exe文件 有可能是由于录制的URL地址采用的是localhost的问题 改成分
  • centos系统服务器脚本,CentOS使用脚本管理服务的详解

    1 使用工具 chkconfig 管理 etc rc d init d或 etc init d 目录下的服务启动脚本 要在服务启动脚本开头添加两行 chkconfig 2345 88 12 description XXXXXXXXX XXX
  • 群晖NAS报“发生网络错误。请检查DNS和网络设置”的解决方法

    如标题中所述 新买的群晖DNS 登录Synology账号 设置所谓的QuickConnect的时候就会报这种错误 尝试了一下 控制面板 网络 手动配置DNS服务器 填入 180 76 76 76 再进行类似如图所示的设置即可 呵呵 貌似这个
  • 可能是全网最清晰的KMP算法讲解

    字符串匹配 字符串A是否为字符串B的子串 如果是 出现在B的什么位置 这个问题就是字符串匹配问题 字符串A称为模式串 字符串B称为主串 那么 如何查找模式串在主串中的位置呢 暴力匹配 暴力匹配 顾名思义 是一种简单粗暴的匹配方法 从主串的第
  • ubuntu上安装微信

    一 下载安装Wine环境包 http archive ubuntukylin com software pool partner ukylin wine 70 6 3 25 amd64 deb 二 下载安装微信包 http archive
  • Oracle:修改表空间和数据文件的名称

    1 修改表空间名称 alter tablespace tablespace name1 rename to tablespace name2 2 修改数据文件名称 1 先将联机状态的需要修改的表空间设置为脱机状态 ALTER TABLESP
  • 解决Value '0000-00-00 ' can not be represented as java.sql.Timest

    在使用MySql 时 数据库中的字段类型是timestamp的 默认为0000 00 00 会发生异常 java sql SQLException Value 0000 00 00 can not be represented as jav
  • javascript画全年日历

    前些日子闲聊群里有人提了用js画全年日历的需求 趁闲暇时间画了个小demo 下面还是先上效果图吧 高亮显示的是今天的日期和标记要高亮显示的日期 也添加了点击事件的钩子 自己可以实现钩子函数 从而操作点击的日期值 下面还是先上dai 日历视图
  • Linux 系统 /var/log/journal/ 垃圾日志清理

    CentOS系统中有两个日志服务 分别是传统的 rsyslog 和 systemd journal systemd journald是一个改进型日志管理服务 可以收集来自内核 系统早期启动阶段的日志 系统守护进程在启动和运行中的标准输出和错
  • 第1章 Java基础(二)

    1 11 重写和重载的概念 难度 重点 白话解析 这道题它的重点不仅仅是在面试中 因为后续在做开发的时候会接触到大量的重写或重载 也正是因为他们 才实现了Java的多态特性 1 重写 好好理解下 就是本来父亲写好了一个方法 然后儿子觉得父亲
  • 你的Qt按钮可以加载Gif圆形的头像吗?

    先上效果 先看要求 我们首先要求 1 这是一个按钮 所以可以想到重写控件的基类一定是QPushButton 2 我们要求可以播放Gif图片 由此可想到 图片的加载肯定绕不开QMoive 3 头像是圆形的 猜想是不是可以通过样式表 或者重新p
  • 第36步 深度学习图像识别:TensorFlow-gpu环境配置

    基于WIN10的64位系统演示 一 写在前面 从这一期开始分享基于深度学习图像识别的学习笔记和代码 相比于之前的ML分类模型 图像识别的门槛会更高 包括硬件方面 代码复杂度和基础理论知识等 同样 首先把必要的深度学习框架 类似做ML分类 要
  • Windows巧用git实现笔记自动备份

    Windows巧用git实现笔记自动备份 准备git仓库 配置自动上传脚本 设置 Windows 自动定时任务 参考文献 今天突然发现 可以 使用Gitee加上Windows定时任务 实现Windows端的笔记 自动备份 多端同步 历史回溯
  • gin 获取get 所有参数_Golang Gin 实战(三)

    在 上一篇 Golang Gin 实战 二 简便的Restful API 实现 文章中 我们留了一个疑问 假如我们有很多用户 我们要为他们一个个注册路由 路径 吗 路由路径 如下URL users 123 users 456 users 2