gin-巧用Context传递多种参数
目录
引言:
1.巧妙包装gin.Context为NewContext
2 在使用gin.Use对每一个请求的Context进行组装
3 在路由绑定时解析出NewContext来为应用层函数提供参数,并且调用应用层函数
4 总结
引言:
首先给臆造这样一个场景:
假设有web端,有众多用户需要从服务端去索取数据。
分析下这个过程,由于web端有大量用户去访问,每个用户请求的数据是不同的(假设数据库中的数据已经用用户的唯一id进行了区分),那么web端的每次请求中,都应该携带登录用户的id信息。
因此服务端要做的就是根据网络请求中的id及其他信息去数据库中找到匹配的信息并返回。
1.巧妙包装gin.Context为NewContext
熟悉的gin.HandlerFunc的参数为 *gin,Context,因此为了能传递更多的参数,可以设计如下图的这样一种新的结构。
上面这种结构可以作为应用层函数的一个参数,并可以通过应用层一直传递到数据层。那么,如何将NewContext和gin.Context结合起来的,看下一步。
2 在使用gin.Use对每一个请求的Context进行组装
gin提供了gin.Use方法来对每个请求进行相应的处理,因此为了能将gin.Context将NewContext组装在一起,我们可以编写如下函数:
//gin.Use接收的参数为gin.Handlerfunc
func InitContext()gin.HandlerFunc{
return func(c *gin.Context) {
bc := new(NewContext)
bc.ID = c.GetHeader("ID") //从网络请求中拿出id
bc.DBClient = base.Client //这里为数据库连接,可以为新申请的,也可以为全局的,我这里是全局的
c.Set("context",bc)//将NewContext加入在gin.Context中
}
}
在InitContext中,已经将NewContext初始化,并且通过set方法加入到了gin.Context之中,通过下面代码,每一条网络请求的路由的Context中都会持NewContext。
router := gin.New()
router.Use(InitContext)
通过上面的操作,在后续的路由绑定中,我们只需要解析出NewContext来进行应用层函数的调用,这样NewContext的内容就可以一直传递,直到gin.Context cancel掉。
下面将展示如何在路由绑定中将NewContext拿出,并且能在整个gin.Context声明周期中存活。
3 在路由绑定时解析出NewContext来为应用层函数提供参数,并且调用应用层函数
在路由绑定中,我们使用的其都是如下所示的操作:
group := GroupRouter{router.Group("/api/v1")}//路由组
//WeChatEventsAPIs(API_V1)
group.POST(请求路径 string ,响应函数 gin.HandlerFunc) //路由绑定
其中group为路由组,而在路由绑定中,响应函数为gin.HandlerFunc形式,如下:
type HandlerFunc func(*gin.Context)
因此我们在这里可以这样做,编写函数Convert,此函数接收参数为应用层的函数(应用层函数的参数类型可以设置为NewContext),在Convert函数中返回gin.HanderFunc类型的函数,并且在gin.handlerFunc类型的函数中来对应用层的方法进行调用(文字难以表示清楚,详见代码)
详细如下:
//这里 Convert的参数为NewContext的成员方法的类型,Convert的返回值为gin中的响应函数的类型
func Convert(hd HandlerFunc) gin.HandlerFunc {
return func(c *gin.Context) {
context,exi := ctx.Get("context")
if exi==false{//不存在
c.JSON(http.StatusBAD)//返回给web错误
}
json := hd(context) //调用应用层方法,冰鞋得到返回值,应用层后续可以调用业务层等等
c.JSON(http.StatusOK,json)
}
}
因此,路由绑定时应该都是如下格式的:
group.POST(请求路径 string ,Convert(应用层方法))
这样,我们就可以从应用层往下传递NewContext中的所有信息,在实际项目中,我们要传递的信息很多,都可以通过再NewContext中来组装,并且通过上述方式来进行参数的传递。
4 总结
相比较于传统的每次在gin.Context中通过set方法来设置参数,这种NewContext和gin.Context结合的方法更为简洁,在应用层只需要关注NewContext参数,即只需要关注我们需要的参数,我不需要将整个gin.Context都拿出来,大大提高了代码的执行效率和阅读性。
————————————————
版权声明:本文为CSDN博主「WolfOnTheWay」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42214953/article/details/116270187
gin-巧用Context传递多种参数的更多相关文章
- Gin框架04:趣谈参数绑定与校验
导读 在第二节,我们学习了Gin框架的路由定义与参数接收,今天应一位同学的要求,来讲解一下参数的绑定与校验. 为什么校验参数? 本不必抛出这个问题的,但顾及到初出茅庐的同学,这里解释一下. 假设做一个 ...
- asp.net——地址栏传递中文参数乱码解决方案
地址栏传递中文参数乱码解决方案: 很多人在使用地址栏传递参数的时候都会遇到一个麻烦的问题(参数为中文时乱码了),那要怎么解决呢? 其实解决这个问题也不怎么难,无非就是给要传递的中文参数一个编码解码的过 ...
- 关于HTTP请求中更改body中传递的参数方法
更改body中传递的参数方法: String txId = UUID.randomUUID().toString().replaceAll("-", ""); ...
- 在执行方法和Web资源中获取传递过来参数的值
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复228或者20161026可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- .net core 在服务器端获取api传递的参数
在 ActionFilterAttribute 的OnActionExecutionAsync 中使用如下代码从流中读取用户参数 //从文件流中读取传递测参数 using (var ms = new ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- java方法强制传递引用参数(做为返回值),改变被传递参数值。
Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...
- ajax传递array参数
var ticketId = new Array(); for(var i = 0; i < checkboxes.length; i++) { ticketId.push(checkboxes ...
- 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...
- Web报表页面如何传递中文参数
1.场景描述 在用报表开发工具FineReport设计的web报表中,给iframe设置src嵌入某个报表时,往往会给报表传递初始的参数值,例如: <iframe id="report ...
随机推荐
- Java基础——01
今日学习 2020-2-27 Java多态 多态性格式 /* 代码中体现多态性 其实就是一句话:父类指向子类对象 格式: 父类名称 对象名= new 子类名称(): 或者 接口名称 对象名 = new ...
- 第八十三篇:Vue购物车(四) 总价计算
好家伙, 1.总价计算 来了,又先是一波分析: 我们用一个计算属性amt 我们把item中被勾选的项用一个过滤器过滤器来 然后用一个循环相加,把商品的价格乘以商品的数量, 把这个总值返回出去, 然后组 ...
- docker可视化
可视化第一种方式 Portainer(不是最佳选择但先用这个) docker run -d -p 8088:9000 \ #docker run 启动:通过内网9000端口,外网8088端口:rest ...
- 如何结合整洁架构和MVP模式提升前端开发体验(二) - 代码实现篇
上一篇文章介绍了整体架构,接下来说说怎么按照上图的分层结构实现下面的增删改查的功能. 代码结构 vue userManage └── List ├── api.ts ├── EditModal │ ├ ...
- Python入门系列(十一)一篇搞定python操作MySQL数据库
开始 安装MySQL驱动 $ python -m pip install mysql-connector-python 测试MySQL连接器 import mysql.connector 测试MySQ ...
- 弱隔离级别 & 事务并发问题
介绍弱隔离级别 为什么要有弱隔离级别 如果两个事务操作的是不同的数据, 即不存在数据依赖关系, 则它们可以安全地并行执行.但是当出现某个事务修改数据而另一个事务同时要读取该数据, 或者两个事务同时修改 ...
- .NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署
日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 IIS 托管的情况,直接运行有两种方式,一种是部署为 服务模式,另一种则是 直接启动 .NET 发布之后的 exe 文件以 控制台模式运 ...
- Beats:运用 Filebeat 来对微服务 API 进行分析
文章转载自:https://elasticstack.blog.csdn.net/article/details/118145104 需要学习的是httpjson请求的写法 使用 Filebeat 的 ...
- 5N的多次方
N=eval(input(" 请输入一个数:")) for i in range (5): print(pow(N,i))
- Java删除word合并单元格时的重复值
Spire.Doc提供了Table.applyVerticalMerge()方法来垂直合并word文档里面的表格单元格,Table.applyHorizontalMerge()方法来水平合并表格单元格 ...