温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何使用中间件

发布时间:2021-10-14 15:15:20 来源:亿速云 阅读:199 作者:iii 栏目:编程语言

这篇文章主要讲解了“如何使用中间件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用中间件”吧!

中间件

使用场景:

  • auth权限认证
  • 跨域
  • 其他需要在业务处理之前处理的事务

我们接着上一期的工程继续

查看一下目录

➜  go-gin-test tree -L 3 
.
├── go.mod
├── go.sum
├── hello
├── mian.go
└── routerex
   └── router.go
 

routerex目录下新建mid目录 在mid目录下新建mid.go文件

首先我们定义一个中间件。它的作用是在请求到达服务后,但是还未进行业务处理时,需要验证请求是否合法

编辑mid.go

package mid

import (
"github.com/gin-gonic/gin"
)

func midAuth(c *gin.Context) {
//获取请求的ip地址
ip := c.ClientIP()
//如果请求地址来源不正确,那么阻止这个请求继续
if ip != "baidu.com" {
println("ip 地址不正确")
                c.Abort() return
}
// 处理请求
c.Next()
}
 

编辑router.go

package routerex

import (
"example.com/m/v2/routerex/mid"
"github.com/gin-gonic/gin"
)

func InitRouter(g *gin.Engine) {
g1 := g.Group("g1")
//中间件
g1.Use(mid.MidAuth)
g1.GET("/hello1", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "Hello g1",
})
})

g2 := g.Group("g2")
g2.GET("/hello2", func(c *gin.Context) {
c.JSON(200, gin.H{
"msg": "Hello g2",
})
})

}

执行go build -o hello来编译为可执行文件

➜  go-gin-test go build -o hello
➜  go-gin-test ls
go.mod   go.sum   hello    mian.go
 

执行./hello让我们的服务跑起来

打开浏览器访问http://localhost:8080/g1/hello1

如何使用中间件  
image.png
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env:   export GIN_MODE=release
- using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /g1/hello1                --> example.com/m/v2/routerex.InitRouter.func1 (4 handlers)
[GIN-debug] GET    /g2/hello2                --> example.com/m/v2/routerex.InitRouter.func2 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
ip 地址不正确
[GIN] 2021/04/06 - 17:00:38 | 200 |      61.658µs |             ::1 | GET      "/g1/hello1"
 

可以看到我们的浏览器上没有任何输出

但是在后台日志上,我们看到了我们在代码中打印的ip 地址不正确

通过这个思路,我们可以实现很多业务或者场景的需求。

下面这个代码就是通用的跨域中间件

func midCors(c *gin.Context) {
 c.Header("Access-Control-Allow-Origin", c.Request.Header.Get("Origin"))
 c.Header("Access-Control-Allow-Headers", "*")
 c.Header("Access-Control-Allow-Methods", "*")
 c.Header("Access-Control-Allow-Credentials", "true")

 //放行所有OPTIONS方法
 if c.Request.Method == "OPTIONS" {
  c.AbortWithStatus(http.StatusNoContent)
 }
 // 处理请求
 c.Next()
}
   

POST和GET获取值的方式

  • Parameters in path (url路径参数)
name := c.Param("name")
  • Querystring parameters
//这个写法具有默认值
firstname := c.DefaultQuery("firstname", "Guest")
 
  • Multipart/Urlencoded Form(表单)
//无默认值
message := c.PostForm("message")
//有默认值
nick := c.DefaultPostForm("nick", "anonymous")
 
  • Map as querystring or postform parameters(Map或者表单)
ids := c.QueryMap("ids")
names := c.PostFormMap("names")
 
  • file(文件类型)
form, _ := c.MultipartForm()
files := form.File["upload[]"]
 
  • JSON
//结构体
j := J{}
c.BindJSON(j)
 

当然除了上述常用的方式之外,gin还提供的更加丰富的获取参数的方式。

感谢各位的阅读,以上就是“如何使用中间件”的内容了,经过本文的学习后,相信大家对如何使用中间件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI