溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用中間件

發(fā)布時(shí)間:2021-10-14 15:15:20 來源:億速云 閱讀:219 作者:iii 欄目:編程語言

這篇文章主要講解了“如何使用中間件”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何使用中間件”吧!

中間件

使用場(chǎng)景:

  • auth權(quán)限認(rèn)證
  • 跨域
  • 其他需要在業(yè)務(wù)處理之前處理的事務(wù)

我們接著上一期的工程繼續(xù)

查看一下目錄

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

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

首先我們定義一個(gè)中間件。它的作用是在請(qǐng)求到達(dá)服務(wù)后,但是還未進(jìn)行業(yè)務(wù)處理時(shí),需要驗(yàn)證請(qǐng)求是否合法

編輯mid.go

package mid

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

func midAuth(c *gin.Context) {
//獲取請(qǐng)求的ip地址
ip := c.ClientIP()
//如果請(qǐng)求地址來源不正確,那么阻止這個(gè)請(qǐng)求繼續(xù)
if ip != "baidu.com" {
println("ip 地址不正確")
                c.Abort() return
}
// 處理請(qǐng)求
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",
})
})

}

執(zhí)行go build -o hello來編譯為可執(zhí)行文件

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

執(zhí)行./hello讓我們的服務(wù)跑起來

打開瀏覽器訪問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"
 

可以看到我們的瀏覽器上沒有任何輸出

但是在后臺(tái)日志上,我們看到了我們?cè)诖a中打印的ip 地址不正確

通過這個(gè)思路,我們可以實(shí)現(xiàn)很多業(yè)務(wù)或者場(chǎng)景的需求。

下面這個(gè)代碼就是通用的跨域中間件

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)
 }
 // 處理請(qǐng)求
 c.Next()
}
   

POST和GET獲取值的方式

  • Parameters in path (url路徑參數(shù))
name := c.Param("name")
  • Querystring parameters
//這個(gè)寫法具有默認(rèn)值
firstname := c.DefaultQuery("firstname", "Guest")
 
  • Multipart/Urlencoded Form(表單)
//無默認(rèn)值
message := c.PostForm("message")
//有默認(rèn)值
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
//結(jié)構(gòu)體
j := J{}
c.BindJSON(j)
 

當(dāng)然除了上述常用的方式之外,gin還提供的更加豐富的獲取參數(shù)的方式。

感謝各位的閱讀,以上就是“如何使用中間件”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)如何使用中間件這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI