ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

gin-巧用Context传递多种参数

2022-07-13 11:34:13  阅读:176  来源: 互联网

标签:函数 Context NewContext gin 应用层 路由 巧用


目录

 

引言:

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

标签:函数,Context,NewContext,gin,应用层,路由,巧用
来源: https://www.cnblogs.com/gongxianjin/p/16473231.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有