在 上一篇 Golang Gin 实战(三)| 路由参数 文章中,主要介绍了路由通配符、路由参数,让我们有了一种可以从URL路径中获取参数的方式,同时又不是重复的注册相似的路由。

这一篇,主要介绍查询参数,以及获取查询参数的示例以及底层原理。

查询参数(query parames)

Querystring parameters ,翻译成中文我只能叫查询参数了,不过觉得挺别捏的。其实这种参数我们并不陌生,比如:

https://www.flysnow.org/search?q=golang&sitesearch=https%3A%2F%2Fwww.flysnow.org

URL查询参数,或者也可以简称为URL参数,是存在于我们请求的URL中,以?为起点,后面的k=v&k1=v1&k2=v2这样的字符串就是查询参数,比如我上面示例中的:

?q=golang&sitesearch=https%3A%2F%2Fwww.flysnow.org

这个示例中有两个查询参数键值对:

q=golang
sitesearch=https%3A%2F%2Fwww.flysnow.org

第一个key是q,对应的值是golang。第二个key是sitesearch,对应的值是https%3A%2F%2Fwww.flysnow.org,它们通过&相连。在URL中,多个查询参数键值对通过&相连。

Gin获取查询参数

Gin中,为我们提供了简便的方法来获取查询参数的值,我们只需要知道查询参数的key(参数名)就可以了。

func main() {r := gin.Default()r.GET("/", func(c *gin.Context) {c.String(200, c.Query("wechat"))})r.Run(":8080")
}

我们运行这段代码,打开浏览器访问http://localhost:8080/?wechat=flysnow_org,就可以看到flysnow_org文字。这表示我们通过c.Query("wechat")获取到了查询参数wechat的值是flysnow_org

Query方法为我们提供了获取对应key的值的能力,如果该key不存在,则返回""字符串。如果对于一些数字参数,比如id如果返回为空的话,我们进行字符串转数字的时候会报错,这时候,我们就可以通过DefaultQuery方法指定一个默认值:

c.DefaultQuery("wechat", "flysnow_org")c.DefaultQuery("id", "0")

比如这样,尤其是第二个例子,默认为0,让我们字符串转数字很方便。

func (c *Context) Query(key string) string {value, _ := c.GetQuery(key)return value
}func (c *Context) DefaultQuery(key, defaultValue string) string {if value, ok := c.GetQuery(key); ok {return value}return defaultValue
}

看下这两个函数的源代码实现,它们都是调用的GetQuery方法获取对应的值,唯一不同的是DefaultQuery会判断对应的key是否存在,如果不存在的话,则返回默认defaultValue值。

原理解析

从以上两个获取查询参数值的方法可以看到,他们调用的都是GetQuery,这也是gin.Context的一个方法,它和Query唯一不同的是,它返回两个值,可以告诉我们要获取的key是否存在。

value, ok := c.GetQuery("wechat")

如果我们自己的业务中,需要这类功能,可以用GetQuery来代替Query方法。

GetQuery方法的底层实现其实是c.Request.URL.Query().Get(key),通过url.URL.Query()来获取所有的参数键值对。

本质上是调用的GetQueryArray,取的数组中第一个值
func (c *Context) GetQuery(key string) (string, bool) {if values, ok := c.GetQueryArray(key); ok {return values[0], ok}return "", false
}func (c *Context) GetQueryArray(key string) ([]string, bool) {c.getQueryCache() //缓存所有的键值对if values, ok := c.queryCache[key]; ok && len(values) > 0 {return values, true}return []string{}, false
}func (c *Context) getQueryCache() {if c.queryCache == nil {c.queryCache = c.Request.URL.Query()}
}

从以上的实现代码中,可以看到最终的实现都在GetQueryArray方法中,找到对应的key就返回对应的[]string,返回就返回空数组。

这里Gin进行了优化,通过缓存所有的键值对,提升代码的查询效率。这里缓存的queryCache本质上是url.Values,也是一个map[string][]string

type Values map[string][]string

其中c.Request.URL.Query()这个方法就是把?k=v&k1=v1&k2=v2这类查询键值对转换为map[string][]string,所以还是很耗性能的,这里Gin采用了缓存的做法提高了性能挺好,这也是Gin成为性能最快的Golang Web 框架的原因之一吧。

小结

在原理分析这一小结,相信大家也看到了GetQueryArray函数,可以让我们获取key对应的数组,比如多选这类功能,本来打算这一篇文章就介绍下呢,发现这篇内容已经不少了,太多了,大家不容易看完,所以就放到下一节吧。

可能大家没有留意,我的文章,我都会稍微加入一些原理、源代码的分析,这个主要就是为了让大家更了解其中的原理,可以更好的使用它们,更为了大家能够通过这个分析,提升自己的技术能力,比如这里用到的缓存机制。

精彩文章推荐

Golang Gin 实战(三)| 路由参数

Golang Gin 实战(二)| 简便的Restful API 实现

Golang Gin 实战(一)| 快速安装入门

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

html获取url后面的参数_Golang Gin 实战(四)| URL查询参数的获取和原理分析相关推荐

  1. 代理后台中间件_Golang Gin 实战(十三)| 中间件详解看这一篇就够了

    6000字大章带你死磕Golang Gin中间件 在Gin的整个实现中,中间件可谓是Gin的精髓.一个个中间件组成一条中间件链,对HTTP Request请求进行拦截处理,实现了代码的解耦和分离,并且 ...

  2. c++入门代码_Golang Gin 实战(一)| 快速安装入门

    Golang Gin 实战(一)| 快速安装入门 Gin 是一个非常优秀的Golang Web Framework,它不光API友好,性能也非常高,并且设计简洁,便于入门.所以它(Gin)非常受欢迎, ...

  3. 通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL

    在 Web 开发中,有许多情况需要解析 URL,这篇主要学习如何使用 URL 对象实现这一点. 开始 创建一个以下内容的 HTML 文件,并在浏览器中打开. JavaScript URL parsin ...

  4. camel 多个 to_具有多个查询参数的Camel CXF服务

    camel 多个 to 出色的Apache Camel团队忙于解决查询中多个参数的处理问题,这是一种解决方法. 希望本文将在下一版本的Camel中不再使用. (目前,我使用2.7.5) 问题 大于1的 ...

  5. Java EE 8 MVC:使用查询参数

    在上一篇有关新Java EE MVC框架的文章中,我们详细介绍了Controllers . 在本篇和以下文章中,我们将看到如何在MVC控制器中访问各种类型的请求数据. Java EE MVC大量使用了 ...

  6. 具有多个查询参数的Camel CXF服务

    出色的Apache Camel团队忙于解决查询中多个参数的处理问题,这是一种解决方法. 希望该帖子将在下一版本的Camel中变得过时. (当前,我使用2.7.5) 问题 大于1的查询参数作为null值 ...

  7. Solr4:查询参数fq的用法(对结果进行过滤;两组关键词组合查询)

    Solr查询参数文档可以参考: http://wiki.apache.org/solr/CommonQueryParameters#head-6522ef80f22d0e50d2f12ec487758 ...

  8. R语言ncol函数获取dataframe或者matrix列的个数实战

    R语言ncol函数获取dataframe或者matrix列的个数实战 目录 R语言ncol函数获取dataframe或者matrix列的个数实战 #基本语法

  9. R语言libPaths函数获取或者设置包安装的路径实战

    R语言libPaths函数获取或者设置包安装的路径实战 目录 R语言libPaths函数获取或者设置包安装的路径实战 #.libP

最新文章

  1. 高职扩招计算机应用课程,高职扩招带来的“新生”
  2. 大学计算机基础课程报告python-大学计算机基础
  3. 我的第一个python web开发框架(3)——怎么开始?
  4. SAP-FICO学习笔记
  5. 这些Python好书,助你开发一臂之力
  6. jmeterhttp代理服务器_Jmeter使用HTTP代理服务器录制
  7. Java FileInputStream close()方法与示例
  8. TYVJ P1073 加分二叉树 Label:区间dp
  9. ViewPager通过自定义适配器MyPagerAdapter实现界面导航(上标题)
  10. python时间段_python--时间段遍历
  11. BZOJ1014 [JSOI2008]火星人
  12. 基于NextCloud,挂载Aria2+AriaNG实现不限流量、离线BT下载及在线播放
  13. Airsim动态 | ROS教程(AirSim ROS Tutorial)
  14. 制造业生产规划与排程的福音—APS系统
  15. rust相框加载图片代码_vue图片加载与显示默认图片实例代码
  16. 设置鼠标右键文件夹打开idea
  17. 魔兽世界私服 服务器系统要求,全球最大《魔兽世界》私服有望重启 暴雪亲自运营...
  18. Python可视化工具
  19. Steamcommunity302使用教程介绍
  20. 数据库的江湖情仇:事务篇

热门文章

  1. Win32 DLL和MFC DLL 中封装对话框
  2. Linux多任务编程之七:Linux守护进程及其基础实验(转)
  3. Java界面排号系统_【前端系统】javaweb技术的医院门诊在线预约及排号管理系统的实现...
  4. openwrt patch文件怎么用_openwrt 打补丁方式修改内核源码
  5. rstudio安装后打不开_R与RStudio最简单安装指南
  6. 为什么你设计的网页不够惊艳?
  7. 最佳展示场景kit:顶部视角的展示场景(Mockups)
  8. UI设计素材|APP引导页简约风格特征
  9. ui kit模板,让新手设计师临摹提高!
  10. Zero-copy Receive for vhost