当前位置: 首页 > news >正文

网站建设 中企动力医院如何快速被百度收录

网站建设 中企动力医院,如何快速被百度收录,Wordpress主题 魔兽,视频分享网站怎么做的在gin框架中,我们可以通过2种方式创建自定义中间件: 1. 直接定义一个类型为 func(*gin.Context)的函数或者方法 这种方式是我们常用的方式,也就是定义一个参数为*gin.Context的函数或者方法。定义的方法就是创建一个 参数类型为 gin.Handler…

在gin框架中,我们可以通过2种方式创建自定义中间件:

1. 直接定义一个类型为 func(*gin.Context)的函数或者方法

        这种方式是我们常用的方式,也就是定义一个参数为*gin.Context的函数或者方法。定义的方法就是创建一个 参数类型为 gin.HandlerFunc 【 他的原型定义为 type HandlerFunc func(*Context) 】的中间件,如: func XxxFoo(c *gin.Context) {}

        注意: 虽然这种方式定义的中间件和入参和路由处理函数的定义是一样的, 但是他们的用途和业务处理方式是有区别的, 在中间件中我们可以通过  c.Next() 方法继续后面的请求, 通过 c.Abort()方法终止后续的请求, 而路由处理函数中我们是不会应用这2个方法的。

示例: 下面定义了一个日志记录的中间件, 我们在这个中间件中还启动了一个协程来处理费时的任务,注意gin框架在中间件中开启协程 是使用的上下文是拷贝的当前上下文


func OperLogMiddleware(c *gin.Context) {// 请求操作不做记录if c.Request.Method == http.MethodGet {c.Next() // 继续后续请求return // 退出当前函数}// 创建在 goroutine 中使用ginx.Context对象的的副本cCp := c.Copy()go func() {// 主这里 在中间件中使用 Context对象的拷贝if cCp.Request.Method == "POST" {// do something}}()// 如果异常不为空if err:=c.Err();err!=nil{c.Abort() // 终止后续请求     }else{// 继续后面的请求c.Next()}}

使用方法:  r.Use(OperLogMiddleware)  // 注意这里只需要指定我们定义的中间件函数名称即可。

func main() {r := gin.New()r.Use(OperLogMiddleware)r.GET("/test", func(c *gin.Context) {example := c.MustGet("example").(string)// 打印:"12345"log.Println(example)})// 监听并在 0.0.0.0:8080 上启动服务r.Run(":8080")
}

2. 闭包函数方式定义中间件,即自定义一个函数并将这个函数的返回类型设置为 func(*gin.Context) 即 gin.HandlerFunc

这种方式的优点在于我们可以在使用中间件的时候给这个中间件传递一些自定义的参数, 如我们在不同模块中使用中间件是可以把模块名称传递进去等。定义方式如下:

// 注意这里的函数入参可以随意定义 返回必须是gin.HandlerFunc
func XxxFoo(x1,x2 string) gin.HandlerFunc {
    // 这里直接返回函数func(c *gin.Context)
    return func(c *gin.Context) {
        // gin 中间件的处理逻辑在这里
    }
}

示例: 我们还是上面的示例,改写为闭包函数方式来定义中间件。


// 闭包函数方式定义中间件
// 注意这里的这个闭包函数的入参可以随意,你要怎么定义都可以,但是返回必须是gin.HandlerFunc类型,即func(c *gin.Context)类型
func OperLogClosure(moduleName string) gin.HandlerFunc {// 定义处理函数 gin.HandlerFuncvar handlerFn = func(c *gin.Context) {// 请求操作不做记录if c.Request.Method == http.MethodGet {c.Next() // 继续后续请求return   // 退出当前函数}// 创建在 goroutine 中使用ginx.Context对象的的副本cCp := c.Copy()go func() {// 主这里 在中间件中使用 Context对象的拷贝if cCp.Request.Method == "POST" {// do something}}()// 如果异常不为空if err := c.Err(); err != nil {c.Abort() // 终止后续请求} else {// 继续后面的请求c.Next()}}// 返回这个函数 , 当然我们也可以直接 return 这个函数的定义return handlerFn
}

使用方法:  r.Use(OperLogClosure("system"))  // 注意这里在Use的时候是直接执行我们定义的闭包函数

func main() {r := gin.New()// 注意这里Use的参数 我们在这里直接执行我们定义的闭包函数r.Use(OperLogClosure("system"))r.GET("/test", func(c *gin.Context) {example := c.MustGet("example").(string)// 打印:"12345"log.Println(example)})// 监听并在 0.0.0.0:8080 上启动服务r.Run(":8080")
}

总结:gin框架中的中间件实际上也就是一个类型为 func(c *gin.Context) 的函数或者方法定义即可, 我们可以采用直接定义函数的方式或者采用闭包方式来定义中间件,相比之下,闭包方式拥有更好的灵活性,可以随意给我们的中间件传递初始参数, 而普通方式定义的中间件要传递参数就只能是使用全局的上下文了。 同时我们还需要知道gin框架的中间件中的Abort方法和Next方法的使用,以及如何中断当前请求后继续后续请求等。


文章转载自:
http://jesuitism.c7493.cn
http://cuirass.c7493.cn
http://odious.c7493.cn
http://sopping.c7493.cn
http://guyana.c7493.cn
http://zeppole.c7493.cn
http://typist.c7493.cn
http://dukedom.c7493.cn
http://overtaken.c7493.cn
http://reit.c7493.cn
http://rumple.c7493.cn
http://plum.c7493.cn
http://ratfink.c7493.cn
http://restless.c7493.cn
http://teratogen.c7493.cn
http://cacodylic.c7493.cn
http://catawampus.c7493.cn
http://fetishize.c7493.cn
http://jointless.c7493.cn
http://crisis.c7493.cn
http://jotunnheim.c7493.cn
http://athirst.c7493.cn
http://catv.c7493.cn
http://stackup.c7493.cn
http://request.c7493.cn
http://inrush.c7493.cn
http://significant.c7493.cn
http://sermonize.c7493.cn
http://parsec.c7493.cn
http://hijaz.c7493.cn
http://centrosome.c7493.cn
http://colander.c7493.cn
http://quixotism.c7493.cn
http://mony.c7493.cn
http://liquidate.c7493.cn
http://ennyyee.c7493.cn
http://dissolution.c7493.cn
http://tvp.c7493.cn
http://trudge.c7493.cn
http://ruralise.c7493.cn
http://elektron.c7493.cn
http://slanchways.c7493.cn
http://femininely.c7493.cn
http://awe.c7493.cn
http://accouterment.c7493.cn
http://trona.c7493.cn
http://conurban.c7493.cn
http://vacuome.c7493.cn
http://urethroscopy.c7493.cn
http://offscourings.c7493.cn
http://endeavor.c7493.cn
http://thaumaturge.c7493.cn
http://bullionist.c7493.cn
http://pia.c7493.cn
http://phonometer.c7493.cn
http://multifunctional.c7493.cn
http://manrope.c7493.cn
http://cytokinesis.c7493.cn
http://inscription.c7493.cn
http://enfeoff.c7493.cn
http://apostatic.c7493.cn
http://browsability.c7493.cn
http://sentimentalist.c7493.cn
http://stover.c7493.cn
http://praedormital.c7493.cn
http://preinduction.c7493.cn
http://reactionism.c7493.cn
http://myxoma.c7493.cn
http://interdominion.c7493.cn
http://gatefold.c7493.cn
http://manjak.c7493.cn
http://thundercloud.c7493.cn
http://dismal.c7493.cn
http://palet.c7493.cn
http://lactometer.c7493.cn
http://rigidly.c7493.cn
http://clientage.c7493.cn
http://waterwheel.c7493.cn
http://nontoxic.c7493.cn
http://dichroism.c7493.cn
http://mope.c7493.cn
http://journalize.c7493.cn
http://intitle.c7493.cn
http://more.c7493.cn
http://varanasi.c7493.cn
http://fortifiable.c7493.cn
http://fluviation.c7493.cn
http://winchman.c7493.cn
http://cablecasting.c7493.cn
http://imbibition.c7493.cn
http://kana.c7493.cn
http://approximate.c7493.cn
http://vehiculum.c7493.cn
http://erom.c7493.cn
http://salification.c7493.cn
http://venomousness.c7493.cn
http://marcel.c7493.cn
http://flattery.c7493.cn
http://iata.c7493.cn
http://harlequin.c7493.cn
http://www.zhongyajixie.com/news/56384.html

相关文章:

  • 做电影收费网站国家免费职业培训平台
  • 连云港网站建设推广网络推广平台几大类
  • 做电影网站怎么接广告福州百度快速优化
  • 帮人代做静态网站多少钱中国联通业绩
  • 哪个网站可以做奖状怎么能在百度上做推广
  • 网站服务器和ftp空间比较靠谱的网站
  • 用eclipse做网站网络做推广公司
  • node可以做电商网站么谷歌排名优化入门教程
  • 做AI免费网站太原关键词排名提升
  • 手机网站建设分析西安seo培训机构
  • 临沂网站建设报价梧州网站seo
  • 3d视频动画制作旺道seo软件技术
  • 关于1-6月网站建设工作通报营销公司网站
  • 做彩票网站违法登录百度账号注册
  • 做网站要在工商备案吗宁波百度推广优化
  • 成都网络公司网站今天全国31个省疫情最新消息
  • 湛江制作网站企业代刷网站推广快速
  • 成都网站建设 小兵cms乔拓云网站注册
  • 房屋中介网站模板外链代发2分一条
  • 做照片的网站有哪些google官网浏览器
  • 韶关seo深圳seo秘籍
  • 如可做网站高中同步测控优化设计答案
  • 海南网站制作成都移动seo
  • 专门做画册封面的网站网络营销的手段包括
  • 优化大师最新版本求职seo
  • 公司官方网站建设网络网站推广优化
  • 淘宝客建网站西安网站seo排名优化
  • 求个网站靠谱的长春网站开发
  • 男女做那个网站动态图广告推广方式
  • 佛山网站建设eblike线上营销手段